[java-identity-provider] branch master updated: Applying Eclipse settings and code cleanup.

Scott Cantor cantor.2 at osu.edu
Mon Aug 26 13:59:33 EDT 2019


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

scantor pushed a commit to branch master
in repository java-identity-provider.

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

The following commit(s) were added to refs/heads/master by this push:
       new  51cb620   Applying Eclipse settings and code cleanup.
51cb620 is described below

commit 51cb620847a37eaff3a401d4ab0e8f49e96949be
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Aug 26 13:59:28 2019 -0400

    Applying Eclipse settings and code cleanup.
---
 idp-admin-api/.settings/org.eclipse.jdt.core.prefs |  73 +++++++++++++--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../idp/admin/impl/DoStorageOperation.java         |  30 +++----
 ...InitializeAdministrativeProfileContextTree.java |   2 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../idp/attribute/AttributesMapContainer.java      |  10 +--
 .../idp/attribute/ScopedStringAttributeValue.java  |   2 +-
 .../transcoding/AbstractAttributeTranscoder.java   |   3 +-
 .../idp/attribute/transcoding/TranscodingRule.java |  11 ++-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../filter/context/AttributeFilterContext.java     |   4 +-
 .../filter/context/AttributeFilterWorkContext.java |   4 +-
 .../filter/AttributeFilterPolicyTest.java          |   2 +-
 .../idp/attribute/filter/MockMatcher.java          |   4 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../filter/matcher/impl/AbstractStringMatcher.java |   3 +-
 .../matcher/impl/AttributeScopeRegexpMatcher.java  |   7 +-
 .../matcher/impl/AttributeScopeStringMatcher.java  |   7 +-
 .../filter/matcher/impl/ScriptedMatcher.java       |   2 +-
 .../saml/impl/AttributeInMetadataMatcher.java      |  90 +++++++++----------
 .../impl/ProxiedRequesterPolicyRule.java           |  13 ++-
 .../filter/policyrule/impl/ScriptedPolicyRule.java |   3 +-
 .../AbstractRegistrationAuthorityPolicyRule.java   |   3 +-
 .../impl/ValidateExternalAuthenticationTest.java   |   2 +-
 .../filter/matcher/impl/ScriptedMatcherTest.java   |   2 +-
 .../filter/matcher/logic/impl/OrMatcherTest.java   |  11 +--
 .../impl/MappedAttributeInMetadataMatcherTest.java |   8 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../attribute/filter/spring/BaseFilterParser.java  |   3 +-
 .../matcher/BaseAttributeValueMatcherParser.java   |  13 ++-
 .../spring/policyrule/BasePolicyRuleParser.java    |   3 +-
 .../spring/BaseAttributeFilterParserTest.java      |   2 +-
 .../filter/spring/basic/ScriptedTest.java          |   2 +-
 .../matcher/AttributeValueMatcherParserTest.java   |   2 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  74 +++++++++++++--
 .../attribute/impl/ComputedPairwiseIdStore.java    |  14 ++-
 .../idp/attribute/impl/JDBCPairwiseIdStore.java    |   6 +-
 .../impl/AttributeTranscoderRegistryImpl.java      |  29 +++---
 .../impl/AttributeTranscoderRegistryImplTest.java  |  44 ++++-----
 .../attribute/transcoding/impl/PairTranscoder.java |   6 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../attribute/resolver/AbstractDataConnector.java  |  13 ++-
 .../attribute/resolver/AbstractResolverPlugin.java |  23 +++--
 .../context/AttributeResolverWorkContext.java      |   4 +-
 .../resolver/AttributeResolverWorkContextTest.java |   6 --
 .../attribute/resolver/ResolverTestSupport.java    |   4 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../provider/V2SAMLProfileRequestContext.java      |   4 +-
 .../ad/impl/ScriptedAttributeDefinition.java       |   5 +-
 .../dc/http/impl/AbstractHTTPSearchBuilder.java    |   3 +-
 .../http/impl/ScriptedResponseMappingStrategy.java |   2 +-
 .../dc/impl/AbstractSearchDataConnector.java       |   2 +-
 .../resolver/dc/impl/PairwiseIdDataConnector.java  |   5 +-
 .../resolver/dc/impl/ScriptedDataConnector.java    |   2 +-
 .../resolver/dc/impl/SubjectDataConnector.java     |  14 ++-
 .../impl/StringAttributeValueMappingStrategy.java  |   3 +-
 .../TemplatedExecutableSearchFilterBuilder.java    |   2 +-
 .../resolver/dc/rdbms/impl/RDBMSDataConnector.java |  13 ++-
 .../dc/rdbms/impl/StringResultMappingStrategy.java |   3 +-
 .../impl/TemplatedExecutableStatementBuilder.java  |   2 +-
 .../resolver/impl/AttributeResolverImpl.java       |  13 ++-
 .../impl/AttributeResolverServiceGaugeSet.java     |   9 +-
 .../resolver/ad/impl/PrescopedAtributeTest.java    |   6 +-
 .../resolver/ad/impl/RegexAtributeTest.java        |   6 +-
 .../resolver/ad/impl/ScopedAttributeTest.java      |   4 +-
 .../resolver/ad/impl/SimpleAttributeTest.java      |   4 +-
 .../resolver/ad/impl/TemplateAttributeTest.java    |   8 +-
 .../dc/impl/SAMLAttributeDataConnector.java        |   3 +-
 .../dc/impl/StoredIDDataConnectorTest.java         |   3 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../ContextDerivedAttributeDefinitionParser.java   |   3 +-
 .../resolver/spring/dc/impl/CacheConfigParser.java |   6 +-
 .../impl/AbstractResolverPluginFactoryBean.java    |   2 +-
 .../spring/AttributeMappingNodeProcessorTest.java  |  18 ++--
 .../resolver/spring/dc/CacheConfigParserTest.java  |  48 +++++-----
 .../spring/dc/ScriptDataConnectorParserTest.java   |   2 +-
 .../spring/dc/StoredIdDataConnectorParserTest.java |   2 +-
 .../dc/http/HTTPDataConnectorParserTest.java       |   2 +-
 .../dc/ldap/LDAPDataConnectorParserTest.java       |  12 +--
 .../enc/SAML1Base64AttributeEncoderParserTest.java |   4 +-
 ...AML1ScopedStringAttributeEncoderParserTest.java |   4 +-
 .../enc/SAML1StringAttributeEncoderParserTest.java |   4 +-
 .../SAML1XMLObjectAttributeEncoderParserTest.java  |   4 +-
 .../enc/SAML2Base64AttributeEncoderParserTest.java |   4 +-
 ...AML2ScopedStringAttributeEncoderParserTest.java |   4 +-
 .../enc/SAML2StringAttributeEncoderParserTest.java |   4 +-
 .../SAML2XMLObjectAttributeEncoderParserTest.java  |   4 +-
 idp-authn-api/.settings/org.eclipse.jdt.core.prefs |  73 +++++++++++++--
 .../idp/authn/AbstractAuthenticationAction.java    |   3 +-
 .../idp/authn/AbstractCredentialValidator.java     |   5 +-
 .../idp/authn/AbstractExtractionAction.java        |   4 +-
 .../AbstractSubjectCanonicalizationAction.java     |   4 +-
 .../authn/AbstractTemplateSearchDnResolver.java    |   4 +-
 ...bstractUsernamePasswordCredentialValidator.java |   4 +-
 .../idp/authn/AbstractValidationAction.java        |   5 +-
 .../idp/authn/AuthenticationFlowDescriptor.java    |   8 +-
 .../authn/MultiFactorAuthenticationTransition.java |   3 +-
 .../authn/context/RequestedPrincipalContext.java   |   7 +-
 .../navigate/PreviousResultLookupFunction.java     |   4 +-
 ...ontextImpersonatingPrincipalLookupFunction.java |   1 -
 .../SubjectContextPrincipalLookupFunction.java     |   1 -
 .../DefaultPrincipalDeterminationStrategy.java     |   3 +-
 .../PrincipalEvalPredicateFactoryRegistry.java     |   9 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../idp/authn/duo/impl/DuoAuthAuthenticator.java   |   4 +-
 .../shibboleth/idp/authn/duo/impl/DuoDevice.java   |   2 +-
 .../authn/duo/impl/DuoPreauthAuthenticator.java    |   2 +-
 .../idp/authn/duo/impl/DuoPrincipalSerializer.java |  45 +++++-----
 .../shibboleth/idp/authn/duo/impl/DuoSupport.java  |   2 +-
 .../DefaultAuthenticationResultSerializer.java     |  29 ++----
 .../idp/authn/impl/DoLockoutManagerOperation.java  |  20 ++---
 .../idp/authn/impl/FinalizeAuthentication.java     |  10 +--
 .../impl/FinalizeMultiFactorAuthentication.java    |   4 +-
 .../idp/authn/impl/JAASCredentialValidator.java    |   2 +-
 .../authn/impl/KerberosCredentialValidator.java    |  13 ++-
 .../idp/authn/impl/LDAPCredentialValidator.java    |  46 +++++-----
 .../PopulateMultiFactorAuthenticationContext.java  |   4 +-
 .../idp/authn/impl/RemoteUserAuthServlet.java      |   8 +-
 .../idp/authn/impl/SelectAuthenticationFlow.java   |  70 +++++++--------
 .../authn/impl/SimpleSubjectCanonicalization.java  |   4 +-
 .../impl/StorageBackedAccountLockoutManager.java   |  10 +--
 .../impl/TransitionMultiFactorAuthentication.java  |   9 +-
 .../authn/impl/ValidateExternalAuthentication.java |  10 +--
 .../idp/authn/impl/ValidateRemoteUser.java         |  11 ++-
 .../idp/authn/impl/ValidateUserAgentAddress.java   |   2 +-
 .../authn/impl/X500SubjectCanonicalization.java    |   2 +-
 .../shibboleth/idp/authn/impl/X509AuthServlet.java |   2 +-
 .../shibboleth/idp/authn/impl/X509ProxyFilter.java |   2 +-
 .../AuthenticationResultPrincipalSerializer.java   |  57 ++++++------
 .../principal/impl/GenericPrincipalSerializer.java |  98 ++++++++++----------
 .../impl/IdPAttributePrincipalSerializer.java      | 100 ++++++++++-----------
 .../principal/impl/LDAPPrincipalSerializer.java    |  93 ++++++++++---------
 .../impl/PasswordPrincipalSerializer.java          |  54 +++++------
 .../ProxyAuthenticationPrincipalSerializer.java    |  47 +++++-----
 .../impl/UsernamePrincipalSerializer.java          |  50 +++++------
 .../authn/spnego/impl/GSSAcceptorLoginModule.java  |   4 +-
 .../idp/authn/spnego/impl/GSSContextAcceptor.java  |   2 +-
 .../impl/HTPasswdCredentialValidatorTest.java      |  23 +++--
 .../authn/impl/JAASCredentialValidatorTest.java    |  25 +++---
 .../authn/impl/LDAPCredentialValidatorTest.java    |  31 ++++---
 .../idp/authn/impl/ValidateCredentialsTest.java    |  17 ++--
 .../idp/authn/impl/ValidateRemoteUserTest.java     |  13 ++-
 .../authn/impl/ValidateUserAgentAddressTest.java   |  11 ++-
 .../authn/impl/ValidateX509CertificateTest.java    |   9 +-
 .../authn/spnego/impl/KerberosSettingsTest.java    |   2 +-
 .../spnego/impl/SPNEGOAuthnControllerTest.java     |  14 +--
 .../idp/authn/spnego/impl/SPNEGOContextTest.java   |   2 +-
 idp-bom/.settings/org.eclipse.jdt.core.prefs       |  73 +++++++++++++--
 idp-cas-api/.settings/org.eclipse.jdt.core.prefs   |  73 +++++++++++++--
 .../attribute/AbstractCASAttributeTranscoder.java  |   5 +-
 .../shibboleth/idp/cas/protocol/ProtocolError.java |   2 +-
 idp-cas-impl/.settings/org.eclipse.jdt.core.prefs  |  73 +++++++++++++--
 idp-conf/.settings/org.eclipse.jdt.core.prefs      |  73 +++++++++++++--
 .../idp/test/flows/AbstractFlowTest.java           |   2 +-
 .../test/flows/c14n/actions/SetupForSAML1C14N.java |  16 ++--
 .../test/flows/c14n/actions/SetupForSAML2C14N.java |  14 +--
 .../test/flows/interceptor/InterceptFlowTest.java  |  14 +--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../impl/CurrentConsentIdsAuditExtractor.java      |   3 +-
 .../CurrentConsentIsApprovedAuditExtractor.java    |   3 +-
 .../impl/CurrentConsentValuesAuditExtractor.java   |   3 +-
 .../impl/AbstractConsentIndexedStorageAction.java  |  53 +++++------
 .../storage/impl/AbstractConsentStorageAction.java |  28 +++---
 .../flow/storage/impl/ReadConsentFromStorage.java  |   5 +-
 .../consent/flow/storage/impl/UpdateCounter.java   |   2 +-
 .../impl/AbstractAttributeDisplayFunction.java     |   3 +-
 .../idp/consent/logic/impl/AttributePredicate.java |  11 ++-
 .../logic/impl/AttributeValuesHashFunction.java    |  11 +--
 .../logic/impl/CounterStorageKeyFunction.java      |   4 +-
 .../logic/impl/FlowDescriptorLookupFunction.java   |   2 +-
 .../logic/impl/IsAttributeRequiredPredicate.java   |  11 +--
 .../logic/impl/MessageSourceConsentFunction.java   |   3 +-
 .../logic/impl/PreferExplicitOrderComparator.java  |   2 +-
 .../consent/storage/impl/CollectionSerializer.java |  14 +--
 .../consent/storage/impl/ConsentSerializer.java    |  36 ++++----
 .../impl/PopulateAttributeReleaseContextTest.java  |   4 +-
 .../AbstractConsentIndexedStorageActionTest.java   |   2 +-
 .../impl/AbstractConsentStorageActionTest.java     |   2 +-
 .../flow/storage/impl/CreateResultTest.java        |  20 ++---
 .../flow/storage/impl/UpdateCounterTest.java       |   4 +-
 .../logic/impl/CounterStorageKeyFunctionTest.java  |   6 +-
 .../impl/FlowDescriptorLookupFunctionTest.java     |  16 ++--
 .../impl/PreferExplicitOrderComparatorTest.java    |   4 +-
 idp-core/.settings/org.eclipse.jdt.core.prefs      |  73 +++++++++++++--
 .../src/main/java/net/shibboleth/idp/cli/CLI.java  |   2 +-
 .../idp/metrics/ReloadableServiceGaugeSet.java     |   4 +-
 ...IdPPropertiesApplicationContextInitializer.java |  10 +--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 idp-installer/.settings/org.eclipse.jdt.core.prefs |  73 +++++++++++++--
 .../installer/ant/impl/MergePropertiesTask.java    |  12 +--
 .../installer/ant/impl/RewritePropertiesTask.java  |  12 +--
 .../idp/installer/impl/PropertiesWithComments.java |  23 +++--
 .../metadata/impl/MetadataGeneratorParameters.java |  12 +--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../idp/profile/AbstractProfileAction.java         |   2 +-
 .../net/shibboleth/idp/profile/ActionSupport.java  |   5 +-
 .../net/shibboleth/idp/profile/ScriptedAction.java |   2 +-
 .../profile/context/MultiRelyingPartyContext.java  |   3 +-
 .../navigate/ScriptedContextLookupFunction.java    |  40 ++++-----
 .../AbstractProfileInterceptorAction.java          |   2 +-
 .../profile/logic/DynamicAttributePredicate.java   |  13 ++-
 .../idp/profile/logic/RegexAttributePredicate.java |   2 +-
 .../profile/logic/SimpleAttributePredicate.java    |  13 ++-
 .../idp/profile/AbstractProfileActionTest.java     |   8 +-
 .../idp/profile/RequestContextBuilder.java         |   2 +-
 .../context/navigate/ScriptedFunctionTest.java     |  17 ++--
 .../SpringExpressionContextLookupFunctionTest.java |  10 +--
 .../SpringStatusMessageLookupFunctionTest.java     |   3 +-
 .../idp/profile/logic/ScriptedPredicateTest.java   |  10 +--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../audit/impl/AttributesAuditExtractor.java       |   3 +-
 .../profile/audit/impl/PopulateAuditContext.java   |   8 +-
 .../impl/ProfileActionBeanPostProcessor.java       |   3 +-
 .../profile/impl/ReloadServiceConfiguration.java   |  13 +--
 .../messaging/impl/SelectProfileConfiguration.java |   3 +-
 .../impl/CriteriaSelfEntityIDResolver.java         |  10 +--
 .../DefaultRelyingPartyConfigurationResolver.java  |   3 +-
 ...gCriteriaRelyingPartyConfigurationResolver.java |   9 +-
 .../impl/EncryptionCredentialsResolver.java        |   8 +-
 .../impl/SigningCredentialsResolver.java           |   8 +-
 .../idp/profile/impl/FilterAttributesTest.java     |  12 +--
 .../idp/profile/impl/ResolveAttributesTest.java    |   8 +-
 ...WriteProfileInterceptorResultToStorageTest.java |   6 +-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../factory/FlowDefinitionRegistryFactoryBean.java |   8 +-
 .../factory/FlowDefinitionResourceFactory.java     |   3 +-
 .../spring/factory/StaticPKIXFactoryBean.java      |   3 +-
 .../metadata/ScriptTypeBeanParser.java             |   2 +-
 .../metadata/TLSSocketFactoryFactoryBean.java      |   6 +-
 .../filter/impl/AlgorithmFilterParser.java         |   8 +-
 .../filter/impl/EntityAttributesFilterParser.java  |   8 +-
 .../filter/impl/EntityRoleFilterParser.java        |   7 +-
 .../filter/impl/NameIDFormatFilterParser.java      |   8 +-
 .../filter/impl/SignatureValidationParser.java     |   2 +-
 .../AbstractDynamicHTTPMetadataProviderParser.java |   2 +-
 .../AbstractDynamicMetadataProviderParser.java     |   3 +-
 .../AbstractReloadingMetadataProviderParser.java   |   3 +-
 .../metadata/impl/HTTPMetadataProviderParser.java  |   2 +-
 .../trustengine/impl/AbstractStaticPKIXParser.java |   3 +-
 .../impl/CertPathPKIXValidationOptionsParser.java  |   2 +-
 .../impl/ChainingTrustEngineFactory.java           |  10 +--
 .../spring/logic/RelyingPartyIdPredicateTest.java  |   7 +-
 .../metadata/AbstractMetadataParserTest.java       |   4 +-
 .../security/AbstractSecurityParserTest.java       |   3 +-
 .../trustengine/ChainingTrustEngineTest.java       |   6 +-
 .../security/trustengine/MockTrustEngine.java      |   6 +-
 .../trustengine/SignatureChainingParserTest.java   |   2 +-
 .../StaticExplicitKeyFactoryBeanTest.java          |   4 +-
 .../StaticExplicitKeySignatureParserTest.java      |   2 +-
 idp-saml-api/.settings/org.eclipse.jdt.core.prefs  |  73 +++++++++++++--
 .../attribute/transcoding/SAMLEncoderSupport.java  |  36 ++++----
 .../metadata/RelyingPartyMetadataProvider.java     |  12 +--
 .../NameIDCanonicalizationFlowDescriptor.java      |   2 +-
 ...tMetadataDrivenConfigurationLookupStrategy.java |   2 +-
 .../config/BeanConfigurationLookupStrategy.java    |   5 +-
 .../config/BooleanConfigurationLookupStrategy.java |  11 +--
 .../config/DoubleConfigurationLookupStrategy.java  |   5 +-
 .../DurationConfigurationLookupStrategy.java       |  11 +--
 .../config/IntegerConfigurationLookupStrategy.java |   5 +-
 .../config/LongConfigurationLookupStrategy.java    |   5 +-
 .../config/StringConfigurationLookupStrategy.java  |   5 +-
 .../SAMLMetadataContextLookupFunction.java         |   5 +-
 .../SAMLMetadataContextLookupFunction.java         |   5 +-
 .../logic/DefaultNameIdentifierFormatStrategy.java |   5 +-
 .../profile/config/logic/SOAPErrorPredicate.java   |   5 +-
 idp-saml-impl/.settings/org.eclipse.jdt.core.prefs |  73 +++++++++++++--
 .../impl/SAML1ScopedStringAttributeTranscoder.java |   5 +-
 .../impl/SAML2ScopedStringAttributeTranscoder.java |   5 +-
 .../audit/impl/SubStatusCodeAuditExtractor.java    |   2 +-
 .../idp/saml/audit/impl/WriteFTICKSLog.java        |   6 +-
 .../impl/AttributeMappingNodeProcessor.java        |   4 +-
 .../impl/MetadataResolverServiceGaugeSet.java      |  51 ++++++-----
 ...tributeSourcedSAML1NameIdentifierGenerator.java |   3 +-
 .../impl/AttributeSourcedSAML2NameIDGenerator.java |   3 +-
 .../saml/nameid/impl/BaseTransformingDecoder.java  |   4 +-
 .../idp/saml/nameid/impl/BaseTransientDecoder.java |   2 +-
 .../impl/StoredTransientIdGenerationStrategy.java  |   3 +-
 .../BaseIdPInitiatedSSORequestMessageDecoder.java  |   4 +-
 .../impl/PopulateBindingAndEndpointContexts.java   |  10 +--
 .../impl/AddAttributeStatementToAssertion.java     |   5 +-
 .../AddAuthenticationStatementToAssertion.java     |   5 +-
 .../impl/FilterByQueriedAttributeDesignators.java  |   2 +-
 ...tementToAssertionFromInboundAssertionToken.java |   5 +-
 .../impl/AddDelegationPolicyToAssertion.java       |  24 +++--
 .../impl/AddDelegationRestrictionToAssertions.java |   7 +-
 .../impl/DecorateDelegatedAssertion.java           |  28 +++---
 .../delegation/impl/EvaluateDelegationPolicy.java  |  12 ++-
 .../delegation/impl/PopulateDelegationContext.java |   5 +-
 .../delegation/impl/PopulateLibertyContext.java    |   2 +-
 .../delegation/impl/ProcessDelegatedAssertion.java |   3 +-
 .../messaging/impl/AddSenderHandler.java           |   5 +-
 .../messaging/impl/LibertyHTTPSOAP11Encoder.java   |  13 ++-
 .../impl/AddAttributeStatementToAssertion.java     |   5 +-
 .../profile/impl/AddAuthnStatementToAssertion.java |   5 +-
 .../profile/impl/FilterByQueriedAttributes.java    |   2 +-
 ...estedAttributesInAttributeConsumingService.java |   2 +-
 .../profile/impl/PopulateEncryptionParameters.java |   2 +-
 .../saml2/profile/impl/ProcessLogoutRequest.java   |   6 +-
 .../saml/saml2/profile/impl/SOAPLogoutRequest.java |   2 +-
 .../security/impl/KeyAuthorityNodeProcessor.java   |   3 +-
 .../MetadataPKIXValidationInformationResolver.java |   6 +-
 .../idp/saml/session/impl/AddLogoutRequest.java    |   2 +-
 .../session/impl/SAML2SPSessionSerializer.java     |   3 +-
 .../net/shibboleth/idp/saml/impl/TestSources.java  |   1 -
 ...dTransientSAML1NameIdentifierGeneratorTest.java |   2 +-
 .../StoredTransientSAML2NameIDGeneratorTest.java   |   2 +-
 ...itializeOutboundMessageContextForErrorTest.java |   4 +-
 .../PopulateBindingAndEndpointContextsTest.java    |   6 +-
 .../impl/AddAttributeStatementToAssertionTest.java |   6 +-
 .../FilterByQueriedAttributeDesignatorsTest.java   |   7 +-
 .../impl/DecorateDelegatedAssertionTest.java       |   2 +-
 .../impl/LibertyHTTPSOAP11EncoderTest.java         |  20 +++--
 .../impl/AddAttributeStatementToAssertionTest.java |  16 ++--
 .../impl/FilterByQueriedAttributesTest.java        |   7 +-
 idp-schema/.settings/org.eclipse.jdt.core.prefs    |  73 +++++++++++++--
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../shibboleth/idp/session/AbstractIdPSession.java |  10 +--
 .../idp/session/SPSessionSerializerRegistry.java   |  11 ++-
 .../.settings/org.eclipse.jdt.core.prefs           |  73 +++++++++++++--
 .../impl/PopulateLogoutPropagationContext.java     |   7 +-
 .../idp/session/impl/StorageBackedIdPSession.java  |  74 ++++++---------
 .../session/impl/StorageBackedSessionManager.java  |  19 ++--
 idp-ui/.settings/org.eclipse.jdt.core.prefs        |  73 +++++++++++++--
 .../shibboleth/idp/ui/impl/SetRPUIInformation.java |   2 +-
 .../idp/ui/taglib/ServiceContactTag.java           |  12 ++-
 idp-war/.settings/org.eclipse.jdt.core.prefs       |  73 +++++++++++++--
 327 files changed, 3430 insertions(+), 1807 deletions(-)

diff --git a/idp-admin-api/.settings/org.eclipse.jdt.core.prefs b/idp-admin-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-admin-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-admin-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-admin-impl/.settings/org.eclipse.jdt.core.prefs b/idp-admin-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-admin-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-admin-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
index c89d1da..da48be4 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
@@ -172,27 +172,27 @@ public class DoStorageOperation extends AbstractProfileAction {
             response.setHeader("Cache-Control", "must-revalidate,no-cache,no-store");
             
             if ("GET".equals(request.getMethod())) {
-                final StorageRecord record;
+                final StorageRecord<?> record;
                 try {
                     record = storageService.read(context, key);
                     if (record != null) {
                         response.setStatus(HttpServletResponse.SC_OK);
                         final JsonFactory jsonFactory = new JsonFactory();
-                        final JsonGenerator g = jsonFactory.createGenerator(
-                                response.getOutputStream()).useDefaultPrettyPrinter();
-                        g.setCodec(objectMapper);
-                        g.writeStartObject();
-                        g.writeObjectFieldStart("data");
-                        g.writeStringField("type", "records");
-                        g.writeStringField("id", storageService.getId() + '/' + context +'/' + key);
-                        g.writeObjectFieldStart("attributes");
-                        g.writeStringField("value", record.getValue());
-                        g.writeNumberField("version", record.getVersion());
-                        if (record.getExpiration() != null) {
-                            g.writeFieldName("expiration");
-                            g.writeObject(Instant.ofEpochMilli(record.getExpiration()));
+                        try (final JsonGenerator g = jsonFactory.createGenerator(
+                                response.getOutputStream()).useDefaultPrettyPrinter()) {
+                            g.setCodec(objectMapper);
+                            g.writeStartObject();
+                            g.writeObjectFieldStart("data");
+                            g.writeStringField("type", "records");
+                            g.writeStringField("id", storageService.getId() + '/' + context +'/' + key);
+                            g.writeObjectFieldStart("attributes");
+                            g.writeStringField("value", record.getValue());
+                            g.writeNumberField("version", record.getVersion());
+                            if (record.getExpiration() != null) {
+                                g.writeFieldName("expiration");
+                                g.writeObject(Instant.ofEpochMilli(record.getExpiration()));
+                            }
                         }
-                        g.close();
                     } else {
                         sendError(HttpServletResponse.SC_NOT_FOUND,
                                 "Record Not Found", "The specified record was not present or has expired.");
diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
index 39deb23..7990838 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
@@ -83,7 +83,7 @@ public class InitializeAdministrativeProfileContextTree extends AbstractProfileA
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         if (langs != null) {
-            fallbackLanguages = new ArrayList(Collections2.filter(langs, Predicates.notNull()));
+            fallbackLanguages = new ArrayList<>(Collections2.filter(langs, Predicates.notNull()));
         } else {
             fallbackLanguages = null;
         }
diff --git a/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
index 916fd3b..12aed41 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributesMapContainer.java
@@ -23,25 +23,23 @@ import com.google.common.collect.Multimap;
 /**
  * Container for decoded attributes. This gives us a distinguished class to look for in the
  * {@link org.opensaml.core.xml.XMLObject#getObjectMetadata()}.
- * 
- * @param <OutType> The type of object decoded
  */
-public class AttributesMapContainer<OutType extends IdPAttribute> implements Supplier<Multimap<String,OutType>> {
+public class AttributesMapContainer implements Supplier<Multimap<String,IdPAttribute>> {
 
     /** The map we are encapsulating.*/
-    private final Multimap<String,OutType> providedValue;
+    private final Multimap<String,IdPAttribute> providedValue;
 
     /**
      * Constructor.
      * 
      * @param value the value to return.
      */
-    public AttributesMapContainer(final Multimap<String,OutType> value) {
+    public AttributesMapContainer(final Multimap<String,IdPAttribute> value) {
         providedValue = value;
     }
 
     /** {@inheritDoc} */
-    @Override public Multimap<String,OutType> get() {
+    @Override public Multimap<String,IdPAttribute> get() {
         return providedValue;
     }
 
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
index 6ca9d56..08903de 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/ScopedStringAttributeValue.java
@@ -53,7 +53,7 @@ public class ScopedStringAttributeValue extends StringAttributeValue {
     /** {@inheritDoc} */
     @Override
     public Object getNativeValue() {
-        return new Pair<String, String>(getValue(), scope);
+        return new Pair<>(getValue(), scope);
     }
 
     /**
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
index 351c970..a8c57cb 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AbstractAttributeTranscoder.java
@@ -147,7 +147,8 @@ public abstract class AbstractAttributeTranscoder<T> extends AbstractInitializab
             return false;
         }
 
-        final Predicate condition = rule.get(AttributeTranscoderRegistry.PROP_CONDITION, Predicate.class);
+        final Predicate<ProfileRequestContext> condition =
+                rule.get(AttributeTranscoderRegistry.PROP_CONDITION, Predicate.class);
         if (condition != null) {
             if (!condition.test(profileRequestContext)) {
                 log.debug("Transcoder inactive");
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
index a6258b1..073e31d 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/TranscodingRule.java
@@ -124,9 +124,9 @@ public class TranscodingRule {
     @Nullable public <T> T get(@Nonnull @NotEmpty final String key, @Nonnull final Class<T> type) {
         final Object value = rule.get(key);
         if (type.isInstance(value)) {
-            return (T) value;
+            return type.cast(value);
         } else if (type == Boolean.class && value instanceof String) {
-            return (T) Boolean.valueOf((String) value);
+            return type.cast(Boolean.valueOf((String) value));
         } else {
             return null;
         }
@@ -148,9 +148,8 @@ public class TranscodingRule {
         final T value = get(key, type);
         if (value != null) {
             return value;
-        } else {
-            return defValue;
         }
+        return defValue;
     }
     
     /**
@@ -178,7 +177,7 @@ public class TranscodingRule {
     private void processDisplayNames() {
         
         final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
-        final HashSet<Locale> inserted = new HashSet<Locale>();
+        final HashSet<Locale> inserted = new HashSet<>();
         
         for (final Map.Entry<String,Object> entry : rule.entrySet()) {
             if (entry.getValue() instanceof String
@@ -208,7 +207,7 @@ public class TranscodingRule {
     private void processDescriptions() {
         
         final ImmutableMap.Builder<Locale,String> builder = ImmutableMap.builder();
-        final HashSet<Locale> inserted = new HashSet<Locale>();
+        final HashSet<Locale> inserted = new HashSet<>();
         
         for (final Map.Entry<String,Object> entry : rule.entrySet()) {
             if (entry.getValue() instanceof String
diff --git a/idp-attribute-filter-api/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-filter-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-filter-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-filter-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java b/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
index 404bdf0..91fd309 100644
--- a/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
+++ b/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterContext.java
@@ -157,7 +157,7 @@ public final class AttributeFilterContext extends BaseContext {
         final Collection<IdPAttribute> checkedAttributes = new ArrayList<>();
         CollectionSupport.addIf(checkedAttributes, attributes, Predicates.notNull());
 
-        prefilteredAttributes = new HashMap<String, IdPAttribute>(checkedAttributes.size());
+        prefilteredAttributes = new HashMap<>(checkedAttributes.size());
 
         for (final IdPAttribute attribute : checkedAttributes) {
             prefilteredAttributes.put(attribute.getId(), attribute);
@@ -184,7 +184,7 @@ public final class AttributeFilterContext extends BaseContext {
         final Collection<IdPAttribute> checkedAttributes = new ArrayList<>();
         CollectionSupport.addIf(checkedAttributes, attributes, Predicates.notNull());
 
-        filteredAttributes = new HashMap<String, IdPAttribute>(checkedAttributes.size());
+        filteredAttributes = new HashMap<>(checkedAttributes.size());
 
         for (final IdPAttribute attribute : checkedAttributes) {
             filteredAttributes.put(attribute.getId(), attribute);
diff --git a/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java b/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
index 6fcc0a5..6676f1e 100644
--- a/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
+++ b/idp-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
@@ -58,8 +58,8 @@ public final class AttributeFilterWorkContext extends BaseContext {
 
     /** Constructor. */
     public AttributeFilterWorkContext() {
-        permittedValues = new HashMap<String, Set<IdPAttributeValue>>();
-        deniedValues = new HashMap<String, Set<IdPAttributeValue>>();
+        permittedValues = new HashMap<>();
+        deniedValues = new HashMap<>();
     }
 
     /**
diff --git a/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicyTest.java b/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicyTest.java
index c3b3ce0..9fad055 100644
--- a/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicyTest.java
+++ b/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/AttributeFilterPolicyTest.java
@@ -204,7 +204,7 @@ public class AttributeFilterPolicyTest {
         AttributeFilterContext ctx = apply(Tristate.TRUE);
         AttributeFilterWorkContext workCtx = ctx.getSubcontext(AttributeFilterWorkContext.class, false);
         
-        Collection values = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
+        Collection<?> values = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
 
         Assert.assertEquals(values.size(), 2);
         Assert.assertTrue(values.containsAll(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue(
diff --git a/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MockMatcher.java b/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MockMatcher.java
index 5376afd..89e444d 100644
--- a/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MockMatcher.java
+++ b/idp-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/MockMatcher.java
@@ -39,7 +39,7 @@ public class MockMatcher extends AbstractIdentifiedInitializableComponent implem
     private String matchingAttribute;
 
     /** Values, of the attribute, considered to match this matcher. */
-    private Collection matchingValues;
+    private Collection<?> matchingValues;
     
     /** state variable */
     private boolean initialized;
@@ -73,7 +73,7 @@ public class MockMatcher extends AbstractIdentifiedInitializableComponent implem
      * 
      * @param values values, of the attribute, considered to match this matcher
      */
-    public void setMatchingValues(Collection values) {
+    public void setMatchingValues(Collection<?> values) {
         matchingValues = values;
     }
 
diff --git a/idp-attribute-filter-impl/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-filter-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-filter-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-filter-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
index 6ba1324..6396611 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractStringMatcher.java
@@ -107,8 +107,7 @@ public abstract class AbstractStringMatcher extends AbstractMatcher implements M
 
         if (isCaseSensitive()) {
             return value.equals(matchString);
-        } else {
-            return value.equalsIgnoreCase(matchString);
         }
+        return value.equalsIgnoreCase(matchString);
     }
 }
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
index 3751a9c..f9b8e9f 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeRegexpMatcher.java
@@ -45,11 +45,10 @@ public class AttributeScopeRegexpMatcher extends AbstractRegexpStringMatcher {
             final ScopedStringAttributeValue scopedValue = (ScopedStringAttributeValue) value;
             return super.regexpCompare(scopedValue.getScope());
 
-        } else {
-            log.warn("{} Object supplied to ScopedRegexpAttributeValue comparison was of class "
-                    + "'{}', not ScopedAttributeValue, not matched", getLogPrefix(), value.getClass().getName());
-            return false;
         }
+        log.warn("{} Object supplied to ScopedRegexpAttributeValue comparison was of class "
+                + "'{}', not ScopedAttributeValue, not matched", getLogPrefix(), value.getClass().getName());
+        return false;
     }
 
 }
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
index c893435..5f5b4f5 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AttributeScopeStringMatcher.java
@@ -47,11 +47,10 @@ public class AttributeScopeStringMatcher extends AbstractStringMatcher {
             final ScopedStringAttributeValue scopedValue = (ScopedStringAttributeValue) value;
             return super.stringCompare(scopedValue.getScope());
 
-        } else {
-            log.warn("{} Object supplied to ScopedAttributeValue comparison"
-                    + " was of class '{}', not ScopedAttributeValue", getLogPrefix(), value.getClass().getName());
-            return false;
         }
+        log.warn("{} Object supplied to ScopedAttributeValue comparison"
+                + " was of class '{}', not ScopedAttributeValue", getLogPrefix(), value.getClass().getName());
+        return false;
     }
 
 }
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index 35c6800..c9ab418 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
@@ -265,7 +265,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
             }
 
             final Set<IdPAttributeValue> returnValues = new LinkedHashSet<>(attribute.getValues());
-            returnValues.retainAll((Set) result);
+            returnValues.retainAll((Set<?>) result);
             return Collections.unmodifiableSet(returnValues);
         }
 
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
index ab288e4..3723378 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcher.java
@@ -189,11 +189,10 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
                 log.debug("{} The peer's metadata did not contain requested attribute information"
                         + ", returning all the input values", getLogPrefix());
                 return ImmutableSet.copyOf(attribute.getValues());
-            } else {
-                log.debug("{} The peer's metadata did not contain requested attribute information"
-                        + ", returning no values", getLogPrefix());
-                return Collections.emptySet();
             }
+            log.debug("{} The peer's metadata did not contain requested attribute information"
+                    + ", returning no values", getLogPrefix());
+            return Collections.emptySet();
         }
     
         if (attributeName != null) {
@@ -217,55 +216,54 @@ public class AttributeInMetadataMatcher extends AbstractIdentifiableInitializabl
             final Set<IdPAttributeValue> values = new LinkedHashSet<>();
             values.addAll(filterValues(attributeToLog, attribute, requestedAttribute.getAttributeValues()));
             return values;
-        } else {
-            // Utilize pre-mapped approach.
-            final List<AttributesMapContainer> containerList =
-                    service.getObjectMetadata().get(AttributesMapContainer.class);
-            if (null == containerList || containerList.isEmpty() || containerList.get(0).get() == null ||
-                    containerList.get(0).get().isEmpty()) {
-                log.debug("{} No decoded attributes found when filtering", getLogPrefix());
-                if (matchIfMetadataSilent) {
-                    // TODO: not sure what the right answer is here
-                    log.debug("{} The peer's metadata did not contain requested attribute information"
-                            + ", returning all the input values", getLogPrefix());
-                    return ImmutableSet.copyOf(attribute.getValues());
-                } else {
-                    log.debug("{} The peer's metadata did not contain requested attribute information"
-                            + ", returning no values", getLogPrefix());
-                    return Collections.emptySet();
-                }
-            }
-            if (containerList.size() > 1) {
-                log.error("{} More than one set of mapped attributes found when filtering, this shouldn't ever happen",
-                        getLogPrefix());
-            }
-            
-            final Multimap<String,IdPAttribute> requestedAttributes = containerList.get(0).get();
-
-            final Collection<? extends IdPAttribute> requestedAttributeList =
-                    requestedAttributes.get(attribute.getId());
-            if (null == requestedAttributeList) {
-                log.debug("{} Decoded attribute {} not found in metadata", getLogPrefix(), attribute.getId());
-                return Collections.emptySet();
+        }
+        
+        // Utilize pre-mapped approach.
+        final List<AttributesMapContainer> containerList =
+                service.getObjectMetadata().get(AttributesMapContainer.class);
+        if (null == containerList || containerList.isEmpty() || containerList.get(0).get() == null ||
+                containerList.get(0).get().isEmpty()) {
+            log.debug("{} No decoded attributes found when filtering", getLogPrefix());
+            if (matchIfMetadataSilent) {
+                // TODO: not sure what the right answer is here
+                log.debug("{} The peer's metadata did not contain requested attribute information"
+                        + ", returning all the input values", getLogPrefix());
+                return ImmutableSet.copyOf(attribute.getValues());
             }
+            log.debug("{} The peer's metadata did not contain requested attribute information"
+                    + ", returning no values", getLogPrefix());
+            return Collections.emptySet();
+        }
+        if (containerList.size() > 1) {
+            log.error("{} More than one set of mapped attributes found when filtering, this shouldn't ever happen",
+                    getLogPrefix());
+        }
+        
+        final Multimap<String,IdPAttribute> requestedAttributes = containerList.get(0).get();
 
-            final Set<IdPAttributeValue> values = new LinkedHashSet<>();
+        final Collection<? extends IdPAttribute> requestedAttributeList =
+                requestedAttributes.get(attribute.getId());
+        if (null == requestedAttributeList) {
+            log.debug("{} Decoded attribute {} not found in metadata", getLogPrefix(), attribute.getId());
+            return Collections.emptySet();
+        }
 
-            for (final IdPAttribute requestedAttribute
-                    : Collections2.filter(requestedAttributeList, Predicates.notNull())) {
+        final Set<IdPAttributeValue> values = new LinkedHashSet<>();
 
-                if (requestedAttribute instanceof IdPRequestedAttribute
-                        && !((IdPRequestedAttribute) requestedAttribute).getIsRequired() && onlyIfRequired) {
-                    log.debug("{} Decoded attribute {} found in metadata, but not required, values not matched",
-                            getLogPrefix(), attribute.getId());
-                    continue;
-                }
+        for (final IdPAttribute requestedAttribute
+                : Collections2.filter(requestedAttributeList, Predicates.notNull())) {
 
-                values.addAll(filterValues(attribute, requestedAttribute.getValues()));
+            if (requestedAttribute instanceof IdPRequestedAttribute
+                    && !((IdPRequestedAttribute) requestedAttribute).getIsRequired() && onlyIfRequired) {
+                log.debug("{} Decoded attribute {} found in metadata, but not required, values not matched",
+                        getLogPrefix(), attribute.getId());
+                continue;
             }
-            
-            return values;
+
+            values.addAll(filterValues(attribute, requestedAttribute.getValues()));
         }
+        
+        return values;
     
     }
 // Checkstyle: CyclomaticComplexity|ReturnCount|MethodLength ON
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
index f69636c..54a02aa 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/ProxiedRequesterPolicyRule.java
@@ -55,14 +55,13 @@ public class ProxiedRequesterPolicyRule extends AbstractStringPolicyRule {
 
         if (isCaseSensitive()) {
             return ctx.getRequesters().contains(getMatchString()) ? Tristate.TRUE : Tristate.FALSE;
-        } else { 
-            for (final String requester : ctx.getRequesters()) {
-                if (stringCompare(requester) == Tristate.TRUE) {
-                    return Tristate.TRUE;
-                }
+        }
+        for (final String requester : ctx.getRequesters()) {
+            if (stringCompare(requester) == Tristate.TRUE) {
+                return Tristate.TRUE;
             }
-            return Tristate.FALSE;
-        } 
+        }
+        return Tristate.FALSE; 
     }
 
 }
\ No newline at end of file
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
index 62deb64..654bd24 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
@@ -260,9 +260,8 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
             // Non-null result can only be a Boolean or Tristate.
             if (result instanceof Boolean) {
                 return ((Boolean) result).booleanValue() ? Tristate.TRUE : Tristate.FALSE;
-            } else {
-                return (Tristate) result;
             }
+            return (Tristate) result;
         }
 
         /** {@inheritDoc} */
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
index 33be09c..f27e628 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractRegistrationAuthorityPolicyRule.java
@@ -158,9 +158,8 @@ public abstract class AbstractRegistrationAuthorityPolicyRule extends AbstractPo
             log.debug("{} The peer's metadata did not contain a RegistrationInfo descriptor", getLogPrefix());
             if (matchIfMetadataSilent) {
                 return Tristate.TRUE;
-            } else {
-                return Tristate.FALSE;
             }
+            return Tristate.FALSE;
         }
 
         final String authority = info.getRegistrationAuthority();
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/ValidateExternalAuthenticationTest.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/ValidateExternalAuthenticationTest.java
index ab32846..f68eb52 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/ValidateExternalAuthenticationTest.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/ValidateExternalAuthenticationTest.java
@@ -125,7 +125,7 @@ public class ValidateExternalAuthenticationTest extends BaseAuthenticationContex
         final AttributeFilterImpl filter = new AttributeFilterImpl("test", Collections.singletonList(policy));
         filter.initialize();
         
-        return new MockReloadableService<AttributeFilter>(filter);
+        return new MockReloadableService<>(filter);
     }
 
 }
\ No newline at end of file
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
index 0f0da6d..72025b8 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
@@ -194,7 +194,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
     @Test public void custom() throws Exception {
         
         final ScriptedMatcher matcher = newScriptedMatcher(new EvaluableScript("custom;"));
-        final Set<IdPAttributeValue> custom = Collections.singleton((IdPAttributeValue)attribute.getValues().get(0));
+        final Set<IdPAttributeValue> custom = Collections.singleton(attribute.getValues().get(0));
         matcher.setId("Test");
         matcher.setCustomObject(custom);
         matcher.initialize();
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
index edbd672..ee52758 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
@@ -37,6 +37,7 @@ import org.testng.annotations.Test;
 import com.google.common.base.Predicates;
 
 import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.matcher.impl.AbstractMatcherPolicyRuleTest;
 import net.shibboleth.idp.attribute.filter.matcher.impl.MockValuePredicateMatcher;
@@ -137,7 +138,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
 
     @Test public void testRegressionGetValues() throws ComponentInitializationException {
         final OrMatcher matcher =
-                newOrMatcher(Arrays.<Matcher>asList(new MockValuePredicateMatcher(Predicates.alwaysFalse()),
+                newOrMatcher(Arrays.asList(new MockValuePredicateMatcher(Predicates.alwaysFalse()),
                         new MockValuePredicateMatcher(Predicates.alwaysFalse()), new MockValuePredicateMatcher(
                                 equalTo(value1)), new MockValuePredicateMatcher(equalTo(value2))));
         matcher.setId("Test");
@@ -153,10 +154,10 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
     }
 
     @Test public void testNoMatchingValues() throws Exception {
-        final Predicate p = equalTo("Nothing");
-        final Predicate q = equalTo("Zippo");
+        final Predicate<IdPAttributeValue> p = equalTo(StringAttributeValue.valueOf("Nothing"));
+        final Predicate<IdPAttributeValue> q = equalTo(StringAttributeValue.valueOf("Zippo"));
         final OrMatcher matcher =
-                newOrMatcher(Arrays.<Matcher>asList(new MockValuePredicateMatcher(p), new MockValuePredicateMatcher(q)));
+                newOrMatcher(Arrays.asList(new MockValuePredicateMatcher(p), new MockValuePredicateMatcher(q)));
 
         matcher.setId("Test");
         matcher.initialize();
@@ -168,7 +169,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
     }
 
     @Test public void testFails() throws Exception {
-        final OrMatcher matcher = newOrMatcher(Arrays.<Matcher>asList(Matcher.MATCHES_ALL, Matcher.MATCHER_FAILS));
+        final OrMatcher matcher = newOrMatcher(Arrays.asList(Matcher.MATCHES_ALL, Matcher.MATCHER_FAILS));
         matcher.setId("test");
         matcher.initialize();
 
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
index c1ff911..384ed42 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
@@ -77,8 +77,8 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     }
 
     private void setRequestedAttributesInContext(final AttributeFilterContext context,
-            final Multimap<String, IdPRequestedAttribute> multimap) {
-        final AttributesMapContainer<IdPRequestedAttribute> container = new AttributesMapContainer<>(multimap);
+            final Multimap<String, IdPAttribute> multimap) {
+        final AttributesMapContainer container = new AttributesMapContainer(multimap);
         final SAMLMetadataContext samlMetadataContext = context.getSubcontext(SAMLMetadataContext.class, true);
         final AttributeConsumingServiceContext acsCtx =
                 samlMetadataContext.getSubcontext(AttributeConsumingServiceContext.class, true);
@@ -93,7 +93,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
         final AttributeFilterContext context = new AttributeFilterContext();
 
         if (null != attributeId) {
-            final Multimap<String, IdPRequestedAttribute> multimap = ArrayListMultimap.create();
+            final Multimap<String, IdPAttribute> multimap = ArrayListMultimap.create();
             multimap.put(attributeId, attribute);
             setRequestedAttributesInContext(context, multimap);
         }
@@ -212,7 +212,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
 
         final AttributeFilterContext context = new AttributeFilterContext();
 
-        final Multimap<String, IdPRequestedAttribute> multimap = ArrayListMultimap.create();
+        final Multimap<String, IdPAttribute> multimap = ArrayListMultimap.create();
         multimap.put(req1.getId(), req1);
         multimap.put(req2.getId(), req2);
         setRequestedAttributesInContext(context, multimap);
diff --git a/idp-attribute-filter-spring/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-filter-spring/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-filter-spring/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-filter-spring/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
index 1b3153e..a8cd2a8 100644
--- a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
+++ b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/BaseFilterParser.java
@@ -117,9 +117,8 @@ public abstract class BaseFilterParser extends AbstractSingleBeanDefinitionParse
             @Nonnull @NotEmpty final String componentNamespace, @Nonnull @NotEmpty final String reference) {
         if (reference.startsWith("/")) {
             return reference;
-        } else {
-            return getQualifiedId(configElement, componentNamespace, reference);
         }
+        return getQualifiedId(configElement, componentNamespace, reference);
     }
 
     /**
diff --git a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
index 4035068..57db660 100644
--- a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
+++ b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/matcher/BaseAttributeValueMatcherParser.java
@@ -73,16 +73,13 @@ public abstract class BaseAttributeValueMatcherParser extends BaseFilterParser {
         if (isPolicyRule(element)) {
             if (hasAttributeId(element)) {
                 return PolicyFromMatcherId.class;
-            } else {
-                return PolicyFromMatcher.class;
-            }
-        } else {
-            if (hasAttributeId(element)) {
-                return MatcherFromPolicy.class;
-            } else {
-                return getNativeBeanClass();
             }
+            return PolicyFromMatcher.class;
+        }
+        if (hasAttributeId(element)) {
+            return MatcherFromPolicy.class;
         }
+        return getNativeBeanClass();
     }
 
     /**
diff --git a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/BasePolicyRuleParser.java b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/BasePolicyRuleParser.java
index 4734364..d959547 100644
--- a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/BasePolicyRuleParser.java
+++ b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/policyrule/BasePolicyRuleParser.java
@@ -59,9 +59,8 @@ public abstract class BasePolicyRuleParser extends BaseFilterParser {
     @Nonnull protected Class<?> getBeanClass(@Nonnull final Element element) {
         if (isPolicyRule(element)) {
             return getNativeBeanClass();
-        } else {
-            return MatcherFromPolicy.class;
         }
+        return MatcherFromPolicy.class;
     }
 
     /**
diff --git a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/BaseAttributeFilterParserTest.java b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/BaseAttributeFilterParserTest.java
index d641a3e..7607464 100644
--- a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/BaseAttributeFilterParserTest.java
+++ b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/BaseAttributeFilterParserTest.java
@@ -163,7 +163,7 @@ public class BaseAttributeFilterParserTest extends XMLObjectBaseTestCase {
         return getMatcher(fileName, context);
     }
 
-    protected Class rootCause(Throwable what) {
+    protected Class<?> rootCause(Throwable what) {
         Throwable preLast = what;
         do {
             final Throwable next = preLast.getCause();
diff --git a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
index f5bb7ad..883e496 100644
--- a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
+++ b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
@@ -96,7 +96,7 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
         
         final ScriptedPolicyRule what = (ScriptedPolicyRule) getPolicyRule(getScript());
         
-        final Map custom = (Map) what.getCustomObject();
+        final Map<?,?> custom = (Map<?,?>) what.getCustomObject();
      
         assertEquals(custom.size(), 1);
         assertEquals(custom.get("bar"), "foo");
diff --git a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/matcher/AttributeValueMatcherParserTest.java b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/matcher/AttributeValueMatcherParserTest.java
index f2959da..57bc68f 100644
--- a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/matcher/AttributeValueMatcherParserTest.java
+++ b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/matcher/AttributeValueMatcherParserTest.java
@@ -159,7 +159,7 @@ public class AttributeValueMatcherParserTest extends BaseAttributeFilterParserTe
             getMatcher("attributeValueEmptyCaseSensitive.xml");
             fail("should have thrown an exception");
         } catch (FatalBeanException e) {
-            final Class c = rootCause(e);
+            final Class<?> c = rootCause(e);
             assertTrue((c == SAXParseException.class)|(c == IllegalArgumentException.class));
         } 
     }
diff --git a/idp-attribute-impl/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-impl/.settings/org.eclipse.jdt.core.prefs
index 4537d67..7fa508c 100644
--- a/idp-attribute-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,6 +19,15 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
@@ -18,15 +36,21 @@ org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -34,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -156,8 +214,10 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
 org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
@@ -349,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
index 75c32e2..07d9207 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStore.java
@@ -290,22 +290,20 @@ public class ComputedPairwiseIdStore extends AbstractInitializableComponent impl
                     log.debug("Overriding salt for principal '{}' and relying party '{}'", principalName,
                             relyingPartyId);
                     return s.getBytes();
-                } else {
-                    log.debug("Blocked generation of ID for principal '{}' for relying party '{}'",
-                            principalName, relyingPartyId);
-                    return null;
                 }
+                log.debug("Blocked generation of ID for principal '{}' for relying party '{}'",
+                        principalName, relyingPartyId);
+                return null;
             } else if (override.containsKey(WILDCARD_OVERRIDE)) {
                 final String s = override.get(WILDCARD_OVERRIDE);
                 if (s != null) {
                     log.debug("Overriding salt for principal '{}' and relying party '{}'", principalName,
                             relyingPartyId);
                     return s.getBytes();
-                } else {
-                    log.debug("Blocked generation of ID for principal '{}' for relying party '{}'",
-                            principalName, relyingPartyId);
-                    return null;
                 }
+                log.debug("Blocked generation of ID for principal '{}' for relying party '{}'",
+                        principalName, relyingPartyId);
+                return null;
             }
         }
         
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
index 2645ac4..b33e2bf 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/impl/JDBCPairwiseIdStore.java
@@ -528,9 +528,8 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
                 log.error("Exception verifying database", e);
                 throw new ComponentInitializationException(
                         "The database was not reachable or was not defined with an appropriate table + primary key");
-            } else {
-                log.warn("The database was not reachable or was not defined with an appropriate table + primary key",e);
             }
+            log.warn("The database was not reachable or was not defined with an appropriate table + primary key",e);
         }
     }
 
@@ -612,9 +611,8 @@ public class JDBCPairwiseIdStore extends AbstractInitializableComponent implemen
                     if (--retries < 0) {
                         log.warn("Error retryable, but retry limit exceeded");
                         throw new IOException(e);
-                    } else {
-                        log.info("Retrying pairwise ID lookup/create operation");
                     }
+                    log.info("Retrying pairwise ID lookup/create operation");
                 } else {
                     throw new IOException(e);
                 }
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
index 871d915..6e89204 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -137,15 +137,15 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             
             final String internalId = StringSupport.trimOrNull(mapping.get(PROP_ID, String.class));
             if (internalId != null) {
-                final Predicate activationCondition = buildActivationCondition(mapping.getMap());
+                final Predicate<?> activationCondition = buildActivationCondition(mapping.getMap());
                 if (activationCondition != null) {
                     mapping.getMap().put(PROP_CONDITION, activationCondition);
                 } else {
                     mapping.getMap().remove(PROP_CONDITION);
                 }
                 
-                final Collection<AttributeTranscoder> transcoders = getAttributeTranscoders(mapping);
-                for (final AttributeTranscoder transcoder : transcoders) {
+                final Collection<AttributeTranscoder<?>> transcoders = getAttributeTranscoders(mapping);
+                for (final AttributeTranscoder<?> transcoder : transcoders) {
                     addMapping(internalId, transcoder, mapping.getMap());
                 }
             }
@@ -160,9 +160,8 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      
         if (displayNameRegistry.containsKey(attribute.getId())) {
             return displayNameRegistry.get(attribute.getId());
-        } else {
-            return Collections.emptyMap();
         }
+        return Collections.emptyMap();
     }
 
     /** {@inheritDoc} */
@@ -173,9 +172,8 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
         
         if (descriptionRegistry.containsKey(attribute.getId())) {
             return descriptionRegistry.get(attribute.getId());
-        } else {
-            return Collections.emptyMap();
         }
+        return Collections.emptyMap();
     }
     
     /** {@inheritDoc} */
@@ -224,9 +222,8 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             
             return propertyCollections != null ? ImmutableList.copyOf(propertyCollections.get(effectiveType))
                     : Collections.emptyList();
-        } else {
-            log.warn("Object of type {} did not have a canonical name", from.getClass().getName());
         }
+        log.warn("Object of type {} did not have a canonical name", from.getClass().getName());
         
         return Collections.emptyList();
     }
@@ -238,10 +235,10 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      * 
      * @return transcoders to install under a copy of each ruleset's {@link #PROP_TRANSCODER} property
      */
-    @Nonnull @NonnullElements private Collection<AttributeTranscoder> getAttributeTranscoders(
+    @Nonnull @NonnullElements private Collection<AttributeTranscoder<?>> getAttributeTranscoders(
             @Nonnull final TranscodingRule rule) {
         
-        AttributeTranscoder transcoder = rule.get(PROP_TRANSCODER, AttributeTranscoder.class);
+        AttributeTranscoder<?> transcoder = rule.get(PROP_TRANSCODER, AttributeTranscoder.class);
         if (transcoder != null) {
             return Collections.singletonList(transcoder);
         }
@@ -252,7 +249,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             return Collections.emptyList();
         }
 
-        final List<AttributeTranscoder> transcoders = new ArrayList<>();
+        final List<AttributeTranscoder<?>> transcoders = new ArrayList<>();
         
         for (final String id :StringSupport.stringToList(beanNames, " ")) {
             try {
@@ -274,7 +271,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      * @param transcoder the transcoder for this rule
      * @param ruleset transcoding rules
      */
-    private void addMapping(@Nonnull @NotEmpty final String id, @Nonnull final AttributeTranscoder transcoder,
+    private void addMapping(@Nonnull @NotEmpty final String id, @Nonnull final AttributeTranscoder<?> transcoder,
             @Nonnull final Map<String,Object> ruleset) {
 
         
@@ -333,11 +330,11 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
     @Nullable private Predicate<ProfileRequestContext> buildActivationCondition(
             @Nonnull final Map<String,Object> ruleset) {
         
-        Predicate effectiveCondition = null;
+        Predicate<ProfileRequestContext> effectiveCondition = null;
         
         final Object baseCondition = ruleset.get(PROP_CONDITION);
         if (baseCondition instanceof Predicate) {
-            effectiveCondition = (Predicate) baseCondition;
+            effectiveCondition = (Predicate<ProfileRequestContext>) baseCondition;
         } else if (baseCondition instanceof String) {
             try {
                 effectiveCondition = getApplicationContext().getBean((String) baseCondition, Predicate.class);
@@ -348,7 +345,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             log.error("{} property did not contain a Predicate object, ignored", PROP_CONDITION);
         }
 
-        Predicate relyingPartyCondition = null;
+        Predicate<ProfileRequestContext> relyingPartyCondition = null;
 
         final Object relyingParties = ruleset.get(PROP_RELYINGPARTIES);
         if (relyingParties instanceof Collection) {
diff --git a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
index 07e8f3a..367cc6d 100644
--- a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
+++ b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
@@ -57,7 +57,7 @@ public class AttributeTranscoderRegistryImplTest {
         registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
         
-        registry.setNamingRegistry(Collections.singletonMap(Pair.class, (Pair p) -> "{Pair}" + p.getFirst().toString()));
+        registry.setNamingRegistry(Collections.singletonMap(Pair.class, (Pair<?,?> p) -> "{Pair}" + p.getFirst().toString()));
         
         final PairTranscoder transcoder = new PairTranscoder();
         transcoder.initialize();
@@ -116,27 +116,27 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testDecodeNoMappings() throws AttributeDecodingException {
         
-        assertTrue(registry.getTranscodingRules(new Pair("foo", "value")).isEmpty());
-        assertTrue(registry.getTranscodingRules(new MyPair("foo", "value")).isEmpty());
+        assertTrue(registry.getTranscodingRules(new Pair<>("foo", "value")).isEmpty());
+        assertTrue(registry.getTranscodingRules(new MyPair<>("foo", "value")).isEmpty());
         assertTrue(registry.getTranscodingRules(new String("bar")).isEmpty());
     }
 
     @Test public void testDecodeInactive() throws AttributeDecodingException {
 
-        final Pair p = new Pair("ban", "value");
+        final Pair<?,?> p = new Pair<>("ban", "value");
         final Collection<TranscodingRule> rulesets = registry.getTranscodingRules(p);
         assertEquals(rulesets.size(), 1);
         
         final TranscodingRule ruleset = rulesets.iterator().next();
         
-        final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+        final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
         assertNull(t.decode(null, p, ruleset));
     }
 
     @Test public void testEncodeNoValues() throws AttributeEncodingException {
         final IdPAttribute foo = new IdPAttribute("foo");
         
-        final List<Pair> pairs = new ArrayList<>();
+        final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
@@ -157,12 +157,12 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testDecodeOneNoValues() throws AttributeDecodingException {
         
-        final Pair bar = new Pair("bar", null);
+        final Pair<?,?> bar = new Pair<>("bar", null);
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
         
@@ -179,12 +179,12 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testDecodeTwoNoValues() throws AttributeDecodingException {
         
-        final Pair baz = new Pair("baz", null);
+        final Pair<?,?> baz = new Pair<>("baz", null);
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
         
@@ -205,7 +205,7 @@ public class AttributeTranscoderRegistryImplTest {
         final IdPAttribute foo = new IdPAttribute("foo");
         foo.setValues(Collections.singletonList(StringAttributeValue.valueOf("value")));
         
-        final List<Pair> pairs = new ArrayList<>();
+        final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
@@ -249,12 +249,12 @@ public class AttributeTranscoderRegistryImplTest {
     
     @Test public void testDecodeOneStringValues() throws AttributeDecodingException {
         
-        final Pair bar = new Pair("bar", "value");
+        final Pair<?,?> bar = new Pair<>("bar", "value");
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
         
@@ -266,12 +266,12 @@ public class AttributeTranscoderRegistryImplTest {
     
     @Test public void testDecodeTwoStringValues() throws AttributeDecodingException {
         
-        final Pair baz = new Pair("baz", "value");
+        final Pair<?,?> baz = new Pair<>("baz", "value");
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
         
@@ -288,7 +288,7 @@ public class AttributeTranscoderRegistryImplTest {
         final IdPAttribute foo = new IdPAttribute("foo");
         foo.setValues(Collections.singletonList(EmptyAttributeValue.ZERO_LENGTH));
         
-        final List<Pair> pairs = new ArrayList<>();
+        final List<Pair<?,?>> pairs = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(foo, Pair.class)) {
             final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
@@ -309,12 +309,12 @@ public class AttributeTranscoderRegistryImplTest {
     
     @Test public void testDecodeOneUnsupportedValues() throws AttributeDecodingException {
         
-        final Pair bar = new Pair("bar", 0L);
+        final Pair<?,?> bar = new Pair<>("bar", 0L);
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(bar)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, bar, ruleset));
         }
         
@@ -326,12 +326,12 @@ public class AttributeTranscoderRegistryImplTest {
     
     @Test public void testDecodeTwoUnsupportedValues() throws AttributeDecodingException {
         
-        final Pair baz = new Pair("baz", 0L);
+        final Pair<?,?> baz = new Pair<>("baz", 0L);
         
         final List<IdPAttribute> attributes = new ArrayList<>();
         
         for (final TranscodingRule ruleset : registry.getTranscodingRules(baz)) {
-            final AttributeTranscoder<Pair> t = TranscoderSupport.getTranscoder(ruleset);
+            final AttributeTranscoder<Pair<?,?>> t = TranscoderSupport.getTranscoder(ruleset);
             attributes.add(t.decode(null, baz, ruleset));
         }
         
@@ -346,8 +346,8 @@ public class AttributeTranscoderRegistryImplTest {
     
     /** Marker class to exercise subtype support. */
     
-    public static class MyPair extends Pair {
-        public MyPair(Object one, Object two) {
+    public static class MyPair<T,U> extends Pair<T,U> {
+        public MyPair(T one, U two) {
             super(one, two);
         }
     }
diff --git a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
index e7b0f3a..254238e 100644
--- a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
+++ b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
@@ -48,9 +48,8 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
         final String name = rule.get("name", String.class);
         if (name != null) {
             return "{Pair}" + name;
-        } else {
-            return null;
         }
+        return null;
     }
 
     /** {@inheritDoc} */
@@ -66,9 +65,8 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
         try {
             if (attribute.getValues().isEmpty() || !canEncodeValue(attribute, attribute.getValues().get(0))) {
                 return to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, null);
-            } else {
-                return to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, attribute.getValues().get(0).getNativeValue());
             }
+            return to.getDeclaredConstructor(Object.class, Object.class).newInstance(name, attribute.getValues().get(0).getNativeValue());
         } catch (final InstantiationException | IllegalAccessException | IllegalArgumentException
                 | InvocationTargetException | NoSuchMethodException | SecurityException e) {
             throw new AttributeEncodingException(e);
diff --git a/idp-attribute-resolver-api/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-resolver-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-resolver-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-resolver-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
index e004ff9..bdfb998 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnector.java
@@ -193,13 +193,12 @@ public abstract class AbstractDataConnector extends AbstractResolverPlugin<Map<S
         if (null == result) {
             log.debug("{} no attributes were produced during resolution", getId());
             return result;
-        } else {
-            log.debug("{} produced the following {} attributes during resolution {}", new Object[] {getLogPrefix(),
-                    result.size(), result.keySet(),});
-            for (final String attrName : result.keySet()) {
-                final IdPAttribute attr = result.get(attrName);
-                log.debug("{} Attribute '{}': Values '{}'", new Object[] {getLogPrefix(), attrName, attr.getValues(),});
-            }
+        }
+        log.debug("{} produced the following {} attributes during resolution {}", new Object[] {getLogPrefix(),
+                result.size(), result.keySet(),});
+        for (final String attrName : result.keySet()) {
+            final IdPAttribute attr = result.get(attrName);
+            log.debug("{} Attribute '{}': Values '{}'", new Object[] {getLogPrefix(), attrName, attr.getValues(),});
         }
 
         return result;
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
index bb24830..632bc14 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
@@ -243,19 +243,18 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
                 //
                 if (propagateResolutionExceptions) {
                     throw e;
+                }
+                if (e instanceof NoResultAnErrorResolutionException
+                        || e instanceof MultipleResultAnErrorResolutionException) {
+                    log.debug(
+                            "Resolver plugin '{}' produced the following error but was configured not to propagate",
+                            getId(), e);
                 } else {
-                    if (e instanceof NoResultAnErrorResolutionException
-                            || e instanceof MultipleResultAnErrorResolutionException) {
-                        log.debug(
-                                "Resolver plugin '{}' produced the following error but was configured not to propagate",
-                                getId(), e);
-                    } else {
-                        log.error(
-                                "Resolver plugin '{}' produced the following error but was configured not to propagate",
-                                getId(), e);
-                    }
-                    return null;
+                    log.error(
+                            "Resolver plugin '{}' produced the following error but was configured not to propagate",
+                            getId(), e);
                 }
+                return null;
             }
         } finally {
             if (timerStarted) {
@@ -296,7 +295,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
             return false;
         }
 
-        final AbstractResolverPlugin other = (AbstractResolverPlugin) obj;
+        final AbstractResolverPlugin<?> other = (AbstractResolverPlugin<?>) obj;
         return java.util.Objects.equals(getId(), other.getId());
     }
 
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
index 788b7e3..68d90f5 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
@@ -56,9 +56,9 @@ public final class AttributeResolverWorkContext extends BaseContext {
 
     /** Constructor. */
     public AttributeResolverWorkContext() {
-        resolvedAttributeDefinitions = new HashMap<String, ResolvedAttributeDefinition>();
+        resolvedAttributeDefinitions = new HashMap<>();
 
-        resolvedDataConnectors = new HashMap<String, ResolvedDataConnector>();
+        resolvedDataConnectors = new HashMap<>();
     }
 
     /**
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AttributeResolverWorkContextTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AttributeResolverWorkContextTest.java
index 2523169..cebdb28 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AttributeResolverWorkContextTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AttributeResolverWorkContextTest.java
@@ -58,7 +58,6 @@ public class AttributeResolverWorkContextTest {
         Assert.assertNotNull(context.getResolvedIdPAttributeDefinitions());
         Assert.assertEquals(context.getResolvedIdPAttributeDefinitions().size(), 1);
         Assert.assertNotNull(context.getResolvedIdPAttributeDefinitions().get("foo"));
-        Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("foo") instanceof ResolvedAttributeDefinition);
         Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("foo").getResolvedDefinition() == definition);
         Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("foo").resolve(parent) == attribute);
 
@@ -76,9 +75,7 @@ public class AttributeResolverWorkContextTest {
         Assert.assertNotNull(context.getResolvedIdPAttributeDefinitions());
         Assert.assertEquals(context.getResolvedIdPAttributeDefinitions().size(), 2);
         Assert.assertNotNull(context.getResolvedIdPAttributeDefinitions().get("foo"));
-        Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("foo") instanceof ResolvedAttributeDefinition);
         Assert.assertNotNull(context.getResolvedIdPAttributeDefinitions().get("bar"));
-        Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("bar") instanceof ResolvedAttributeDefinition);
         Assert.assertTrue(context.getResolvedIdPAttributeDefinitions().get("bar").getResolvedDefinition() == definition);
         Assert.assertNull(context.getResolvedIdPAttributeDefinitions().get("bar").resolve(parent));
     }
@@ -104,7 +101,6 @@ public class AttributeResolverWorkContextTest {
         Assert.assertNotNull(context.getResolvedDataConnectors());
         Assert.assertEquals(context.getResolvedDataConnectors().size(), 1);
         Assert.assertNotNull(context.getResolvedDataConnectors().get("foo"));
-        Assert.assertTrue(context.getResolvedDataConnectors().get("foo") instanceof ResolvedDataConnector);
         Assert.assertTrue(context.getResolvedDataConnectors().get("foo").getResolvedConnector() == connector);
         Assert.assertTrue(context.getResolvedDataConnectors().get("foo").resolve(parent) == attributes);
 
@@ -122,9 +118,7 @@ public class AttributeResolverWorkContextTest {
         Assert.assertNotNull(context.getResolvedDataConnectors());
         Assert.assertEquals(context.getResolvedDataConnectors().size(), 2);
         Assert.assertNotNull(context.getResolvedDataConnectors().get("foo"));
-        Assert.assertTrue(context.getResolvedDataConnectors().get("foo") instanceof ResolvedDataConnector);
         Assert.assertNotNull(context.getResolvedDataConnectors().get("bar"));
-        Assert.assertTrue(context.getResolvedDataConnectors().get("bar") instanceof ResolvedDataConnector);
         Assert.assertTrue(context.getResolvedDataConnectors().get("bar").getResolvedConnector() == connector);
         Assert.assertNull(context.getResolvedDataConnectors().get("bar").resolve(parent));
         
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolverTestSupport.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolverTestSupport.java
index a88a9a8..2195eeb 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolverTestSupport.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolverTestSupport.java
@@ -50,7 +50,7 @@ public class ResolverTestSupport {
 
     public static final String[] EPE3_VALUES = new String[] {"urn:example.org:entitlement2"};
 
-    public static AttributeResolutionContext buildResolutionContext(ResolverPlugin... plugins) {
+    public static AttributeResolutionContext buildResolutionContext(ResolverPlugin<?>... plugins) {
         final AttributeResolutionContext resolutionContext = new AttributeResolutionContext();
         final AttributeResolverWorkContext workContext =
                 resolutionContext.getSubcontext(AttributeResolverWorkContext.class, true);
@@ -58,7 +58,7 @@ public class ResolverTestSupport {
         MockStaticAttributeDefinition definition;
         MockStaticDataConnector connector;
         try {
-            for (ResolverPlugin plugin : plugins) {
+            for (ResolverPlugin<?> plugin : plugins) {
                 if (plugin instanceof MockStaticAttributeDefinition) {
                     definition = (MockStaticAttributeDefinition) plugin;
                     workContext.recordAttributeDefinitionResolution(definition,
diff --git a/idp-attribute-resolver-impl/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-resolver-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-resolver-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-resolver-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-resolver-impl/src/main/java/edu/internet2/middleware/shibboleth/common/attribute/provider/V2SAMLProfileRequestContext.java b/idp-attribute-resolver-impl/src/main/java/edu/internet2/middleware/shibboleth/common/attribute/provider/V2SAMLProfileRequestContext.java
index 1eae7cd..5bca981 100644
--- a/idp-attribute-resolver-impl/src/main/java/edu/internet2/middleware/shibboleth/common/attribute/provider/V2SAMLProfileRequestContext.java
+++ b/idp-attribute-resolver-impl/src/main/java/edu/internet2/middleware/shibboleth/common/attribute/provider/V2SAMLProfileRequestContext.java
@@ -833,7 +833,7 @@ public class V2SAMLProfileRequestContext {
      * 
      * @return null
      */
-    public Collection getReleasedAttributes() {
+    public Collection<?> getReleasedAttributes() {
         unsupportedMethod("getReleasedAttributes");
         return null;
     }
@@ -843,7 +843,7 @@ public class V2SAMLProfileRequestContext {
      * 
      * @param param ignored.
      */
-    public void setReleasedAttributes(final Collection param) {
+    public void setReleasedAttributes(final Collection<?> param) {
         unsupportedMethod("setReleasedAttributes");
     }
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
index e8d5aef..a659daa 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
@@ -303,10 +303,9 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
                 } catch (final ResolutionException e) {
                     throw new ScriptException(e);
                 }
-            } else {
-                throw new ScriptException(getLogPrefix() + " returned variable was of wrong type ("
-                        + result.getClass().toString() + ")");
             }
+            throw new ScriptException(getLogPrefix() + " returned variable was of wrong type ("
+                    + result.getClass().toString() + ")");
         }
     }
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
index 8026b72..bba795c 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/AbstractHTTPSearchBuilder.java
@@ -228,9 +228,8 @@ public abstract class AbstractHTTPSearchBuilder extends AbstractInitializableCom
             @Nonnull final Map<String, List<IdPAttributeValue>> dependencyAttributes) {
         if (request instanceof HttpGet) {
             return ((HttpGet) request).getURI().toString();
-        } else {
-            return null;
         }
+        return null;
     }
 
 }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
index 3ce4e97..b7096c0 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/ScriptedResponseMappingStrategy.java
@@ -184,7 +184,7 @@ public final class ScriptedResponseMappingStrategy extends AbstractScriptEvaluat
             throw new ScriptException("Output was of the wrong type");
         }
 
-        final Collection outputCollection = (Collection) res;
+        final Collection<?> outputCollection = (Collection<?>) res;
         final Map<String, IdPAttribute> outputMap = new HashMap<>(outputCollection.size());
         for (final Object o : outputCollection) {
             if (o instanceof IdPAttribute) {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index 8205cb3..717d89a 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -50,7 +50,7 @@ import com.google.common.cache.Cache;
  * @param <T1> type of executable search
  * @param <T2> type of mapping strategy
  */
-public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2 extends MappingStrategy>
+public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2 extends MappingStrategy<?>>
     extends AbstractDataConnector {
 
     /** Class logger. */
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
index 27f2ea8..eea1281 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
@@ -282,10 +282,9 @@ public class PairwiseIdDataConnector extends AbstractDataConnector {
             pid = pidStore.getBySourceValue(pid, true);
             if (pid != null && pid.getPairwiseId() != null) {
                 return encodeAsAttribute(pid.getPairwiseId());
-            } else {
-                log.warn("{} Pairwise ID store did not return a value", getLogPrefix());
-                return null;
             }
+            log.warn("{} Pairwise ID store did not return a value", getLogPrefix());
+            return null;
         } catch (final IOException e) {
             throw new ResolutionException(e);
         }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
index 3775b90..67932d3 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
@@ -279,7 +279,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
                 throw new ScriptException("Output was of the wrong type");
             }
 
-            final Collection outputCollection = (Collection) res;
+            final Collection<?> outputCollection = (Collection<?>) res;
             final Map<String, IdPAttribute> outputMap = new HashMap<>(outputCollection.size());
             for (final Object o : outputCollection) {
                 if (o instanceof IdPAttribute) {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/SubjectDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/SubjectDataConnector.java
index eee7a99..52203c4 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/SubjectDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/SubjectDataConnector.java
@@ -110,11 +110,10 @@ public class SubjectDataConnector extends AbstractDataConnector {
         if (sc == null || sc.getSubjects().isEmpty()) {
             if (noResultIsError) {
                 throw new ResolutionException("No Subjects available to obtain attributes");
-            } else {
-                log.debug("{} Obtained no attributes from Subjects for principal '{}'", getLogPrefix(),
-                        resolutionContext.getPrincipal());
-                return Collections.emptyMap();
             }
+            log.debug("{} Obtained no attributes from Subjects for principal '{}'", getLogPrefix(),
+                    resolutionContext.getPrincipal());
+            return Collections.emptyMap();
         }
         
         final Map<String,IdPAttribute> results = new HashMap<>();
@@ -128,11 +127,10 @@ public class SubjectDataConnector extends AbstractDataConnector {
         if (results.isEmpty()) {
             if (noResultIsError) {
                 throw new ResolutionException("No IdPAttributePrincipal objects found");
-            } else {
-                log.debug("{} Obtained no attributes from Subjects for principal '{}'", getLogPrefix(),
-                        resolutionContext.getPrincipal());
-                return Collections.emptyMap();
             }
+            log.debug("{} Obtained no attributes from Subjects for principal '{}'", getLogPrefix(),
+                    resolutionContext.getPrincipal());
+            return Collections.emptyMap();
         }
         
         log.debug("{} Extracted {} IdPAttribute(s)", getLogPrefix(), results.size());
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/StringAttributeValueMappingStrategy.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/StringAttributeValueMappingStrategy.java
index 5eb88dc..9435b31 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/StringAttributeValueMappingStrategy.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/StringAttributeValueMappingStrategy.java
@@ -102,9 +102,8 @@ public class StringAttributeValueMappingStrategy extends AbstractMappingStrategy
         log.trace("Mapping strategy mapped {} to {}", results, attributes);
         if (attributes.isEmpty()) {
             return null;
-        } else {
-            return attributes;
         }
+        return attributes;
     }
  // Checkstyle: CyclomaticComplexity ON
     
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/TemplatedExecutableSearchFilterBuilder.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/TemplatedExecutableSearchFilterBuilder.java
index d8ad4eb..e5a3414 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/TemplatedExecutableSearchFilterBuilder.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/TemplatedExecutableSearchFilterBuilder.java
@@ -245,7 +245,7 @@ public class TemplatedExecutableSearchFilterBuilder extends AbstractExecutableSe
                 return encodedValues.toArray();
             } else if (value instanceof Collection) {
                 final List<Object> encodedValues = new ArrayList<>();
-                for (final Object o : (Collection) value) {
+                for (final Object o : (Collection<?>) value) {
                     encodedValues.add(encode(o));
                 }
                 return encodedValues;
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
index df25e1d..be13dd6 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
@@ -138,20 +138,16 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
             throw new ResolutionException("Executable statement cannot be null");
         }
         Connection connection = null;
-        ResultSet queryResult = null;
         try {
             connection = dataSource.getConnection();
-            queryResult = statement.execute(connection);
-            log.trace("Data connector '{}': search returned {}", getId(), queryResult);
-            return getMappingStrategy().map(queryResult);
+            try (final ResultSet queryResult = statement.execute(connection)) {
+                log.trace("Data connector '{}': search returned {}", getId(), queryResult);
+                return getMappingStrategy().map(queryResult);
+            }
         } catch (final SQLException e) {
             throw new ResolutionException(getLogPrefix() + " Unable to execute SQL query", e);
         } finally {
             try {
-                if (queryResult != null) {
-                    queryResult.close();
-                }
-
                 if (connection != null && !connection.isClosed()) {
                     connection.close();
                 }
@@ -161,4 +157,5 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
             }
         }
     }
+
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/StringResultMappingStrategy.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/StringResultMappingStrategy.java
index 71e3d0f..5377c09 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/StringResultMappingStrategy.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/StringResultMappingStrategy.java
@@ -106,9 +106,8 @@ public class StringResultMappingStrategy extends AbstractMappingStrategy<ResultS
 
             if (attributes.isEmpty()) {
                 return null;
-            } else {
-                return attributes;
             }
+            return attributes;
         } catch (final SQLException e) {
             throw new ResolutionException("Error reading data from result set", e);
         }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/TemplatedExecutableStatementBuilder.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/TemplatedExecutableStatementBuilder.java
index 01a060d..a190a28 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/TemplatedExecutableStatementBuilder.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/TemplatedExecutableStatementBuilder.java
@@ -243,7 +243,7 @@ public class TemplatedExecutableStatementBuilder extends AbstractExecutableState
                 return encodedValues.toArray();
             } else if (value instanceof Collection) {
                 final List<Object> encodedValues = new ArrayList<>();
-                for (final Object o : (Collection) value) {
+                for (final Object o : (Collection<?>) value) {
                     encodedValues.add(encode(o));
                 }
                 return encodedValues;
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
index 56559bc..99d7911 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
@@ -281,9 +281,8 @@ public class AttributeResolverImpl extends AbstractServiceableComponent<Attribut
             final Collection<String> attributeIds = new LazyList<>();
             attributeIds.addAll(attributeDefinitions.keySet());
             return attributeIds;
-        } else {
-            return resolutionContext.getRequestedIdPAttributeNames();
         }
+        return resolutionContext.getRequestedIdPAttributeNames();
 
     }
 
@@ -376,9 +375,8 @@ public class AttributeResolverImpl extends AbstractServiceableComponent<Attribut
                 resolveDataConnector(failoverDataConnectorId, resolutionContext);
                 workContext.recordFailoverResolution(connector, dataConnectors.get(failoverDataConnectorId));
                 return;
-            } else {
-                throw new ResolutionException("Previous resolve failed");
             }
+            throw new ResolutionException("Previous resolve failed");
         }
 
         resolveDependencies(connector, resolutionContext);
@@ -394,11 +392,10 @@ public class AttributeResolverImpl extends AbstractServiceableComponent<Attribut
                 resolveDataConnector(failoverDataConnectorId, resolutionContext);
                 workContext.recordFailoverResolution(connector, dataConnectors.get(failoverDataConnectorId));
                 return;
-            } else {
-                // Pass it on. Do not look at propagateException because this is handled in the
-                // connector code logic.
-                throw e;
             }
+            // Pass it on. Do not look at propagateException because this is handled in the
+            // connector code logic.
+            throw e;
         }
 
         if (null != resolvedAttributes) {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverServiceGaugeSet.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverServiceGaugeSet.java
index 54b560e..fbfcaea 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverServiceGaugeSet.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverServiceGaugeSet.java
@@ -101,16 +101,15 @@ public class AttributeResolverServiceGaugeSet extends ReloadableServiceGaugeSet<
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
 
-        final ServiceableComponent component = getService().getServiceableComponent();
+        final ServiceableComponent<?> component = getService().getServiceableComponent();
         if (component != null) {
             try {
                 if (component.getComponent() instanceof AttributeResolver) {
                     return;
-                } else {
-                    log.error("{} : Injected service was not for an AttributeResolver ({})",
-                            getLogPrefix(), component.getClass());
-                    throw new ComponentInitializationException("Injected service was not for an AttributeResolver");
                 }
+                log.error("{} : Injected service was not for an AttributeResolver ({})",
+                        getLogPrefix(), component.getClass());
+                throw new ComponentInitializationException("Injected service was not for an AttributeResolver");
             } finally {
                 component.unpinComponent();
             }
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
index b285ad5..0487bf5 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
@@ -91,7 +91,7 @@ public class PrescopedAtributeTest {
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
         resolver.resolveAttributes(context);
-        final Collection f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(f.size(), 2);
         assertTrue(f.contains(new ScopedStringAttributeValue("at1", "Data")));
@@ -182,7 +182,7 @@ public class PrescopedAtributeTest {
         attrDef.initialize();
         final IdPAttribute result = attrDef.resolve(resolutionContext);
         
-        final Collection f = result.getValues();
+        final Collection<?> f = result.getValues();
 
         assertEquals(f.size(), 2);
         assertTrue(f.contains(new ScopedStringAttributeValue("one", "two")));
@@ -217,7 +217,7 @@ public class PrescopedAtributeTest {
         final AttributeResolutionContext context = new AttributeResolutionContext();
         resolver.resolveAttributes(context);
 
-        final Collection f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         // 2 empty attribute values are produced, but they get de-duped into a single value
         assertEquals(f.size(), 1);
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
index 8ad134b..e1ea322 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
@@ -92,7 +92,7 @@ public class RegexAtributeTest {
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
         resolver.resolveAttributes(context);
-        final Collection f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(f.size(), 1);
         assertTrue(f.contains(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_RESULT), "looking for regexp result");
@@ -121,7 +121,7 @@ public class RegexAtributeTest {
 
         final IdPAttribute result = attrDef.resolve(resolutionContext);
         
-        final Collection f = result.getValues();
+        final Collection<?> f = result.getValues();
 
         assertEquals(f.size(), 1);
         assertTrue(f.contains(new StringAttributeValue("Connect")));
@@ -175,7 +175,7 @@ public class RegexAtributeTest {
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
         resolver.resolveAttributes(context);
-        final Collection f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(f.size(), 1);
         assertEquals(f.iterator().next(), EmptyAttributeValue.ZERO_LENGTH);
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
index cec6f34..f2bfb65 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
@@ -98,7 +98,7 @@ public class ScopedAttributeTest {
         resolver.resolveAttributes(context);
 
         // Now test that we got exactly what we expected - two scoped attributes
-        final Collection f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> f = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
 
         assertEquals(f.size(), 2);
         assertTrue(
@@ -154,7 +154,7 @@ public class ScopedAttributeTest {
 
         final IdPAttribute  result = attrDef.resolve(resolutionContext);
         
-        final Collection f = result.getValues();
+        final Collection<?> f = result.getValues();
 
         assertEquals(f.size(), 2);
         assertTrue(f.contains(new ScopedStringAttributeValue("one", TEST_SCOPE)));
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
index 9fcdb55..72af187 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
@@ -112,7 +112,7 @@ public class SimpleAttributeTest {
             fail("resolution failed", e);
         }
 
-        final Collection values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
         assertEquals(values.size(), 2);
         assertTrue(values.contains(TestSources.COMMON_ATTRIBUTE_VALUE_RESULT), "looking for " + TestSources.COMMON_ATTRIBUTE_VALUE_STRING);
         assertTrue(values.contains(TestSources.CONNECTOR_ATTRIBUTE_VALUE_RESULT),
@@ -227,7 +227,7 @@ public class SimpleAttributeTest {
             fail("resolution failed", e);
         }
 
-        final Collection values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
+        final Collection<?> values = context.getResolvedIdPAttributes().get(TEST_ATTRIBUTE_NAME).getValues();
         assertTrue(values.contains(TestSources.COMMON_ATTRIBUTE_VALUE_RESULT),
                 "looking for value " + TestSources.COMMON_ATTRIBUTE_VALUE_STRING);
         assertTrue(values.contains(TestSources.ATTRIBUTE_ATTRIBUTE_VALUE_RESULT),
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
index 78d1908..6a1ee08 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
@@ -143,7 +143,7 @@ public class TemplateAttributeTest {
         final AttributeResolutionContext context = new AttributeResolutionContext();
         context.getSubcontext(AttributeResolverWorkContext.class, true);
         final IdPAttribute val = attr.resolve(context);
-        final Collection results = val.getValues();
+        final Collection<?> results = val.getValues();
 
         assertEquals(results.size(), 0, "Templated value count");
 
@@ -210,7 +210,7 @@ public class TemplateAttributeTest {
         resolver.resolveAttributes(context);
 
         final IdPAttribute a = context.getResolvedIdPAttributes().get(name);
-        final Collection results = a.getValues();
+        final Collection<?> results = a.getValues();
         assertEquals(results.size(), 1, "Templated value count");
         assertTrue(results.contains(SIMPLE_VALUE_RESULT), "Single value context is correct");
 
@@ -255,7 +255,7 @@ public class TemplateAttributeTest {
         resolver.resolveAttributes(context);
 
         final IdPAttribute a = context.getResolvedIdPAttributes().get(name);
-        final Collection results = a.getValues();
+        final Collection<?> results = a.getValues();
         assertEquals(results.size(), 2, "Templated value count");
         String s =
                 "Att " + TestSources.COMMON_ATTRIBUTE_VALUE_STRING + "-"
@@ -299,7 +299,7 @@ public class TemplateAttributeTest {
         resolver.resolveAttributes(context);
 
         final IdPAttribute a = context.getResolvedIdPAttributes().get(name);
-        final Collection results = a.getValues();
+        final Collection<?> results = a.getValues();
         assertEquals(results.size(), 2, "Templated value count");
         assertTrue(results.contains(new StringAttributeValue("Att ")), "First Match");
         assertTrue(results.contains(new StringAttributeValue("Att ${at1}")), "Second Match");
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnector.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnector.java
index 5413d3e..319e2d6 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnector.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnector.java
@@ -121,9 +121,8 @@ public class SAMLAttributeDataConnector extends AbstractDataConnector {
 
         if (separator < 0) {
             return new StringAttributeValue(value);
-        } else {
-            return new ScopedStringAttributeValue(value.substring(0, separator), value.substring(separator + 1));
         }
+        return new ScopedStringAttributeValue(value.substring(0, separator), value.substring(separator + 1));
     }
 
     /**
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
index ee2ff13..327ddf9 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/StoredIDDataConnectorTest.java
@@ -183,8 +183,7 @@ public class StoredIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         resolver = constructResolver(1);
 
         
-        final PairwiseIdDataConnector connector =
-                (PairwiseIdDataConnector) ComputedIDDataConnectorTest.connectorFromResolver(resolver);
+        final PairwiseIdDataConnector connector = ComputedIDDataConnectorTest.connectorFromResolver(resolver);
         ComponentSupport.initialize(resolver);
         connector.initialize();
         
diff --git a/idp-attribute-resolver-spring/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-resolver-spring/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-attribute-resolver-spring/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-resolver-spring/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
index 0f78e49..4b8647e 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ad/impl/ContextDerivedAttributeDefinitionParser.java
@@ -50,9 +50,8 @@ public class ContextDerivedAttributeDefinitionParser extends BaseAttributeDefini
 
         if (null == functionRef) {
             throw new BeanCreationException(getLogPrefix() + "requires 'attributeValuesFunctionRef'");
-        } else {
-            builder.addPropertyReference("attributeValuesFunction", functionRef);
         }
+        builder.addPropertyReference("attributeValuesFunction", functionRef);
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
index 51aba3f..3bf5d7c 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/CacheConfigParser.java
@@ -130,9 +130,8 @@ public class CacheConfigParser {
     private static long getMaxSize(@Nullable final String maximumSize) {
         if (maximumSize != null) {
             return Long.parseLong(maximumSize);
-        }  else {
-            return  DEFAULT_CACHE_ENTRIES;   
         }
+        return  DEFAULT_CACHE_ENTRIES;
     }
     
     /** Helper function to return the TTL with a suitable default.
@@ -142,9 +141,8 @@ public class CacheConfigParser {
     @Nonnull private static Duration getTimeToLive(@Nullable final String timeToLive) {
         if (timeToLive != null) {
             return new StringToDurationConverter().convert(timeToLive);
-        }  else {
-            return DEFAULT_TTL_MS;   
         }
+        return DEFAULT_TTL_MS;
     }
     
     /**
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
index f99b066..e7d3550 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
@@ -37,7 +37,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
  * 
  * @param <T> The exact type being deployed.
  */
-public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolverPlugin> extends
+public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolverPlugin<?>> extends
         AbstractComponentAwareFactoryBean<T> {
 
     /** The component Id. */
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
index ce168fe..063703d 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
@@ -84,11 +84,11 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         setTestContext(context);
         context.setDisplayName("ApplicationContext: ");
 
-        final ConversionServiceFactoryBean service = new ConversionServiceFactoryBean();
-        service.setConverters(new HashSet<>(Arrays.asList(new StringToDurationConverter())));
-        service.afterPropertiesSet();
+        final ConversionServiceFactoryBean service1 = new ConversionServiceFactoryBean();
+        service1.setConverters(new HashSet<>(Arrays.asList(new StringToDurationConverter())));
+        service1.afterPropertiesSet();
 
-        context.getBeanFactory().setConversionService(service.getObject());
+        context.getBeanFactory().setConversionService(service1.getObject());
         
         SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                 new SchemaTypeAwareXMLBeanDefinitionReader(context);
@@ -136,25 +136,25 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
 
         final AttributesMapContainer container = acs.getObjectMetadata().get(AttributesMapContainer.class).get(0);
 
-        final Multimap<String,IdPRequestedAttribute> map = container.get();
+        final Multimap<String,IdPAttribute> map = container.get();
 
         assertEquals(map.size(), 3);
 
-        Collection<IdPRequestedAttribute> attribute = map.get("dn1");
+        Collection<IdPAttribute> attribute = map.get("dn1");
         assertEquals(attribute.size(), 1);
-        IdPRequestedAttribute attr = attribute.iterator().next();
+        IdPRequestedAttribute attr = IdPRequestedAttribute.class.cast(attribute.iterator().next());
         assertTrue(attr.getValues().isEmpty());
         assertFalse(attr.getIsRequired());
 
         attribute = map.get("dn2");
         assertEquals(attribute.size(), 1);
-        attr = attribute.iterator().next();
+        attr = IdPRequestedAttribute.class.cast(attribute.iterator().next());
         assertTrue(attr.getValues().isEmpty());
         assertTrue(attr.getIsRequired());
         
         attribute = map.get("eppn");
         assertEquals(attribute.size(), 1);
-        attr = attribute.iterator().next();
+        attr = IdPRequestedAttribute.class.cast(attribute.iterator().next());
         assertTrue(attr.getValues().isEmpty());
         assertFalse(attr.getIsRequired());
     }
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/CacheConfigParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/CacheConfigParserTest.java
index e1dfa48..9dcf9c5 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/CacheConfigParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/CacheConfigParserTest.java
@@ -46,13 +46,11 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
-        final GenericApplicationContext context = new GenericApplicationContext();
-        
-        context.registerBeanDefinition("ElementTTL", ccp.createCache(null));
-        context.refresh();
-        context.getBean("ElementTTL", Cache.class);
-        
-        context.close();
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
+            context.registerBeanDefinition("ElementTTL", ccp.createCache(null));
+            context.refresh();
+            context.getBean("ElementTTL", Cache.class);
+        }
     }
 
     @Test public void access() throws XMLParserException, IOException {
@@ -61,13 +59,11 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
-        final GenericApplicationContext context = new GenericApplicationContext();
-        
-        context.registerBeanDefinition("Access", ccp.createCache(null));
-        context.refresh();
-        context.getBean("Access", Cache.class);
-        
-        context.close();
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
+            context.registerBeanDefinition("Access", ccp.createCache(null));
+            context.refresh();
+            context.getBean("Access", Cache.class);
+        }
     }
 
     @Test public void write() throws XMLParserException, IOException {
@@ -76,13 +72,11 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
-        final GenericApplicationContext context = new GenericApplicationContext();
-        
-        context.registerBeanDefinition("Write", ccp.createCache(null));
-        context.refresh();
-        context.getBean("Write", Cache.class);
-        
-        context.close();
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
+            context.registerBeanDefinition("Write", ccp.createCache(null));
+            context.refresh();
+            context.getBean("Write", Cache.class);
+        }
     }
 
     @Test public void both() throws XMLParserException, IOException {
@@ -91,13 +85,11 @@ public class CacheConfigParserTest extends OpenSAMLInitBaseTestCase {
         final Document doc = parserPool.parse(resource.getInputStream());
             final CacheConfigParser ccp = new CacheConfigParser(doc.getDocumentElement());
         
-        final GenericApplicationContext context = new GenericApplicationContext();
-        
-        context.registerBeanDefinition("Write", ccp.createCache(null));
-        context.refresh();
-        context.getBean("Write", Cache.class);
-        
-        context.close();
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
+            context.registerBeanDefinition("Write", ccp.createCache(null));
+            context.refresh();
+            context.getBean("Write", Cache.class);
+        }
     }
 
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ScriptDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ScriptDataConnectorParserTest.java
index e0e92cf..e729e14 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ScriptDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ScriptDataConnectorParserTest.java
@@ -57,7 +57,7 @@ public class ScriptDataConnectorParserTest extends BaseAttributeDefinitionParser
         final ScriptedDataConnector dataConnector = getDataConnector(source, ScriptedDataConnector.class);
         dataConnector.initialize();
         
-        final Map custom = (Map) dataConnector.getCustomObject();
+        final Map<?,?> custom = (Map<?,?>) dataConnector.getCustomObject();
         
         assertEquals(custom.size(), 1);
         assertEquals(custom.get("bar"), "foo");
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIdDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIdDataConnectorParserTest.java
index b03342b..b8c7249 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIdDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIdDataConnectorParserTest.java
@@ -83,7 +83,7 @@ public class StoredIdDataConnectorParserTest extends BaseAttributeDefinitionPars
 
         setTestContext(context);
         
-        return (PairwiseIdDataConnector) context.getBean(PairwiseIdDataConnector.class);
+        return context.getBean(PairwiseIdDataConnector.class);
     }
 
     @Test public void beanManaged() throws ComponentInitializationException, IOException {
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/HTTPDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/HTTPDataConnectorParserTest.java
index 7fdb32e..30dafbf 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/HTTPDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/http/HTTPDataConnectorParserTest.java
@@ -348,7 +348,7 @@ public class HTTPDataConnectorParserTest {
         assertEquals(((StringAttributeValue)attrs.get("bar").getValues().get(1)).getValue(), "bar2");
     }
     
-    private HTTPDataConnector getDataConnector(final PropertySource propSource, final String... beanDefinitions)
+    private HTTPDataConnector getDataConnector(final PropertySource<?> propSource, final String... beanDefinitions)
             throws IOException {
 
         final ResourceLoader loader = new PreferFileSystemResourceLoader();
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
index 4a9ef5d..95ea7e6 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
@@ -202,7 +202,7 @@ public class LDAPDataConnectorParserTest {
         final CredentialConfig credentialConfig = sslConfig.getCredentialConfig();
         assertNotNull(credentialConfig);
 
-        final ProviderConfig providerConfig = connFactory.getProvider().getProviderConfig();
+        final ProviderConfig<?> providerConfig = connFactory.getProvider().getProviderConfig();
         assertNotNull(providerConfig);
         assertTrue(providerConfig.getProperties().isEmpty());
 
@@ -217,7 +217,7 @@ public class LDAPDataConnectorParserTest {
         assertTrue(validator.isThrowValidateError());
         assertNotNull(validator.getConnectionFactory());
 
-        final ExecutableSearchBuilder searchBuilder = dataConnector.getExecutableSearchBuilder();
+        final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
 
         final StringAttributeValueMappingStrategy mappingStrategy = (StringAttributeValueMappingStrategy) dataConnector.getMappingStrategy();
@@ -277,7 +277,7 @@ public class LDAPDataConnectorParserTest {
         final CredentialConfig credentialConfig = sslConfig.getCredentialConfig();
         assertNotNull(credentialConfig);
 
-        final ProviderConfig providerConfig = connPool.getConnectionFactory().getProvider().getProviderConfig();
+        final ProviderConfig<?> providerConfig = connPool.getConnectionFactory().getProvider().getProviderConfig();
         assertNotNull(providerConfig);
         assertTrue(providerConfig.getProperties().isEmpty());
 
@@ -292,7 +292,7 @@ public class LDAPDataConnectorParserTest {
         assertTrue(validator.isThrowValidateError());
         assertNotNull(validator.getConnectionFactory());
 
-        final ExecutableSearchBuilder searchBuilder = dataConnector.getExecutableSearchBuilder();
+        final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
 
         final StringAttributeValueMappingStrategy mappingStrategy = (StringAttributeValueMappingStrategy) dataConnector.getMappingStrategy();
@@ -496,7 +496,7 @@ public class LDAPDataConnectorParserTest {
         final Map<String, Object> providerProps = new HashMap<>();
         providerProps.put("name1", "value1");
         providerProps.put("name2", "value2");
-        final ProviderConfig providerConfig = connPool.getConnectionFactory().getProvider().getProviderConfig();
+        final ProviderConfig<?> providerConfig = connPool.getConnectionFactory().getProvider().getProviderConfig();
         assertNotNull(providerConfig);
         assertEquals(providerProps, providerConfig.getProperties());
 
@@ -511,7 +511,7 @@ public class LDAPDataConnectorParserTest {
         assertTrue(validator.isThrowValidateError());
         assertNotNull(validator.getConnectionFactory());
 
-        final ExecutableSearchBuilder searchBuilder = dataConnector.getExecutableSearchBuilder();
+        final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
 
         final StringAttributeValueMappingStrategy mappingStrategy = (StringAttributeValueMappingStrategy) dataConnector.getMappingStrategy();
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
index efb526d..8f7cf00 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1Base64AttributeEncoderParserTest.java
@@ -47,7 +47,7 @@ public class SAML1Base64AttributeEncoderParserTest extends BaseEncoderDefinition
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ByteAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "SAML1_BASE64_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE), "SAML1_BASE64_ATTRIBUTE_NAME_SPACE");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, encodeType==null ? false : encodeType);
     }
 
@@ -58,7 +58,7 @@ public class SAML1Base64AttributeEncoderParserTest extends BaseEncoderDefinition
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1ByteAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "Base64_ATTRIBUTE");
         assertNull(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
index 7590d28..e1d8bba 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1ScopedStringAttributeEncoderParserTest.java
@@ -50,7 +50,7 @@ public class SAML1ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
         assertEquals(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE), "attribute");
         assertEquals(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_ATTR_NAME), "saml1ScopeAttrib");
         assertEquals(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER), "#@#");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, encodeType!=null ? encodeType : false);
 }
 
@@ -64,7 +64,7 @@ public class SAML1ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
         assertNull(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE));
         assertNull(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_ATTR_NAME));
         assertNull(rule.get(SAML1ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
index 13ae3ec..3e38e0b 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringAttributeEncoderParserTest.java
@@ -47,7 +47,7 @@ public class SAML1StringAttributeEncoderParserTest extends BaseEncoderDefinition
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1StringAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "SAML1_STRING_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE), "SAML1_STRING_ATTRIBUTE_NAME_SPACE");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
 
@@ -58,7 +58,7 @@ public class SAML1StringAttributeEncoderParserTest extends BaseEncoderDefinition
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1StringAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "ATTRIBUTE");
         assertNull(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
index 0ae5a24..b40dae4 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1XMLObjectAttributeEncoderParserTest.java
@@ -47,7 +47,7 @@ public class SAML1XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "SAML1_XMLObject_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE), "SAML1_XMLObject_ATTRIBUTE_NAME_SPACE");
-        assertEquals(activation, ((Predicate<Object>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, encodeType!=null ? encodeType : true);
     }
     
@@ -57,7 +57,7 @@ public class SAML1XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
         assertTrue(rule.get(AttributeTranscoderRegistry.PROP_TRANSCODER) instanceof SAML1XMLObjectAttributeTranscoder);
         assertEquals(rule.get(SAML1AttributeTranscoder.PROP_NAME), "XMLObject_ATTRIBUTE");
         assertNull(rule.get(SAML1AttributeTranscoder.PROP_NAMESPACE));
-        assertFalse(((Predicate<Object>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML1AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
index 98744f5..9c7eb95 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2Base64AttributeEncoderParserTest.java
@@ -48,7 +48,7 @@ public class SAML2Base64AttributeEncoderParserTest extends BaseEncoderDefinition
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "Saml2Base64_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT), "Saml2Base64_ATTRIBUTE_NAME_FORMAT");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME), "Saml2Base64_ATTRIBUTE_FRIENDLY_NAME");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
@@ -59,7 +59,7 @@ public class SAML2Base64AttributeEncoderParserTest extends BaseEncoderDefinition
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "Base64Name");
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT));
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
index 76e5214..60d3787 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2ScopedStringAttributeEncoderParserTest.java
@@ -51,7 +51,7 @@ public class SAML2ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
         assertEquals(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE), "attribute");
         assertEquals(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_ATTR_NAME), "scopeAttrib");
         assertEquals(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER), "###");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, encodeType!=null ? encodeType : false);
     }
     
@@ -65,7 +65,7 @@ public class SAML2ScopedStringAttributeEncoderParserTest extends BaseEncoderDefi
         assertNull(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_TYPE));
         assertNull(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_ATTR_NAME));
         assertNull(rule.get(SAML2ScopedStringAttributeTranscoder.PROP_SCOPE_DELIMITER));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
index 9b2692a..a9eb63d 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2StringAttributeEncoderParserTest.java
@@ -48,7 +48,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseEncoderDefinition
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "Saml2String_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT), "Saml2String_ATTRIBUTE_NAME_FORMAT");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME), "Saml2String_ATTRIBUTE_FRIENDLY_NAME");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, encodeType!=null ? encodeType : false);
     }
     
@@ -59,7 +59,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseEncoderDefinition
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "Saml2StringName");
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT));
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
index c777d1e..31e508c 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML2XMLObjectAttributeEncoderParserTest.java
@@ -48,7 +48,7 @@ public class SAML2XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "Saml2XmlObject_ATTRIBUTE_NAME");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT), "Saml2XmlObject_ATTRIBUTE_NAME_FORMAT");
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME), "Saml2XmlObject_ATTRIBUTE_FRIENDLY_NAME");
-        assertEquals(activation, ((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertEquals(activation, ((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, encodeType!=null ? encodeType : true);
     }
 
@@ -59,7 +59,7 @@ public class SAML2XMLObjectAttributeEncoderParserTest extends BaseEncoderDefinit
         assertEquals(rule.get(SAML2AttributeTranscoder.PROP_NAME), "XmlObjectName");
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_NAME_FORMAT));
         assertNull(rule.get(SAML2AttributeTranscoder.PROP_FRIENDLY_NAME));
-        assertFalse(((Predicate) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
+        assertFalse(((Predicate<?>) rule.get(AttributeTranscoderRegistry.PROP_CONDITION)).test(null));
         checkEncodeType(rule, SAML2AttributeTranscoder.PROP_ENCODE_TYPE, true);
     }
     
diff --git a/idp-authn-api/.settings/org.eclipse.jdt.core.prefs b/idp-authn-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-authn-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-authn-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractAuthenticationAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractAuthenticationAction.java
index 325e5d2..23cecfc 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractAuthenticationAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractAuthenticationAction.java
@@ -82,9 +82,8 @@ public abstract class AbstractAuthenticationAction
             }
     
             return doPreExecute(profileRequestContext, authnContext);
-        } else {
-            return false;
         }
+        return false;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractCredentialValidator.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractCredentialValidator.java
index ead7263..8c687fa 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractCredentialValidator.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractCredentialValidator.java
@@ -212,10 +212,9 @@ public abstract class AbstractCredentialValidator extends AbstractIdentifiedInit
                                 getLogPrefix(), configName, p.getClass(), requestedPrincipalCtx.getOperator());
                         requestedPrincipalCtx.setMatchingPrincipal(predicate.getMatchingPrincipal());
                         return true;
-                    } else {
-                        log.debug("{} Validator '{}' not compatible with principal type '{}' and operator '{}'",
-                                getLogPrefix(), configName, p.getClass(), requestedPrincipalCtx.getOperator());
                     }
+                    log.debug("{} Validator '{}' not compatible with principal type '{}' and operator '{}'",
+                            getLogPrefix(), configName, p.getClass(), requestedPrincipalCtx.getOperator());
                 } else {
                     log.debug("{} No comparison logic registered for principal type '{}' and operator '{}'",
                             getLogPrefix(), p.getClass(), requestedPrincipalCtx.getOperator());
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractExtractionAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractExtractionAction.java
index 3fc6013..9aa4081 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractExtractionAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractExtractionAction.java
@@ -77,10 +77,10 @@ public abstract class AbstractExtractionAction extends AbstractAuthenticationAct
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         Constraint.isNotNull(newTransforms, "Transforms collection cannot be null");
         
-        transforms = new ArrayList();
+        transforms = new ArrayList<>();
         for (final Pair<String,String> p : newTransforms) {
             final Pattern pattern = Pattern.compile(StringSupport.trimOrNull(p.getFirst()));
-            transforms.add(new Pair(pattern, Constraint.isNotNull(
+            transforms.add(new Pair<>(pattern, Constraint.isNotNull(
                     StringSupport.trimOrNull(p.getSecond()), "Replacement expression cannot be null")));
         }
     }
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
index e99d0ae..f94f33a 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractSubjectCanonicalizationAction.java
@@ -112,10 +112,10 @@ public abstract class AbstractSubjectCanonicalizationAction
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         Constraint.isNotNull(newTransforms, "Transforms collection cannot be null");
         
-        transforms = new ArrayList();
+        transforms = new ArrayList<>();
         for (final Pair<String,String> p : newTransforms) {
             final Pattern pattern = Pattern.compile(StringSupport.trimOrNull(p.getFirst()));
-            transforms.add(new Pair(pattern, Constraint.isNotNull(
+            transforms.add(new Pair<>(pattern, Constraint.isNotNull(
                     StringSupport.trimOrNull(p.getSecond()), "Replacement expression cannot be null")));
         }
     }
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractTemplateSearchDnResolver.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractTemplateSearchDnResolver.java
index 7c99cc1..40497cf 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractTemplateSearchDnResolver.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractTemplateSearchDnResolver.java
@@ -99,13 +99,13 @@ public abstract class AbstractTemplateSearchDnResolver extends AbstractSearchDnR
             if (value == null) {
                 return null;
             } else if (value instanceof Object[]) {
-                final List<Object> encodedValues = new ArrayList();
+                final List<Object> encodedValues = new ArrayList<>();
                 for (final Object o : (Object[]) value) {
                     encodedValues.add(encode(o));
                 }
                 return encodedValues.toArray();
             } else if (value instanceof Collection<?>) {
-                final List<Object> encodedValues = new ArrayList();
+                final List<Object> encodedValues = new ArrayList<>();
                 for (final Object o : (Collection<?>) value) {
                     encodedValues.add(encode(o));
                 }
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractUsernamePasswordCredentialValidator.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractUsernamePasswordCredentialValidator.java
index 9faf33e..262ba0d 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractUsernamePasswordCredentialValidator.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractUsernamePasswordCredentialValidator.java
@@ -173,10 +173,10 @@ public abstract class AbstractUsernamePasswordCredentialValidator extends Abstra
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         Constraint.isNotNull(newTransforms, "Transforms collection cannot be null");
         
-        transforms = new ArrayList();
+        transforms = new ArrayList<>();
         for (final Pair<String,String> p : newTransforms) {
             final Pattern pattern = Pattern.compile(StringSupport.trimOrNull(p.getFirst()));
-            transforms.add(new Pair(pattern, Constraint.isNotNull(
+            transforms.add(new Pair<>(pattern, Constraint.isNotNull(
                     StringSupport.trimOrNull(p.getSecond()), "Replacement expression cannot be null")));
         }
     }
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
index 14e1b29..ca0e856 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
@@ -302,10 +302,9 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
                                 p.getClass(), rpCtx.getOperator());
                         rpCtx.setMatchingPrincipal(predicate.getMatchingPrincipal());
                         return true;
-                    } else {
-                        log.debug("{} Not compatible with principal type '{}' and operator '{}'", getLogPrefix(),
-                                p.getClass(), rpCtx.getOperator());
                     }
+                    log.debug("{} Not compatible with principal type '{}' and operator '{}'", getLogPrefix(),
+                            p.getClass(), rpCtx.getOperator());
                 } else {
                     log.debug("{} No comparison logic registered for principal type '{}' and operator '{}'",
                             getLogPrefix(), p.getClass(), rpCtx.getOperator());
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
index c06cd87..6e5d116 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationFlowDescriptor.java
@@ -392,7 +392,7 @@ public class AuthenticationFlowDescriptor extends AbstractIdentifiableInitializa
             return principals.iterator().next();
         } else {
             final Object[] principalArray = principals.toArray();
-            Arrays.sort(principalArray, new WeightedComparator());
+            Arrays.sort(principalArray, new WeightedComparator<>());
             return (T) principalArray[principalArray.length - 1];
         }
     }
@@ -429,12 +429,14 @@ public class AuthenticationFlowDescriptor extends AbstractIdentifiableInitializa
     /**
      * A {@link Comparator} that compares the mapped weights of the two operands, using a weight of zero
      * for any unmapped values.
+     * 
+     * @param <T> object type
      */
-    private class WeightedComparator implements Comparator {
+    private class WeightedComparator<T> implements Comparator<T> {
 
         /** {@inheritDoc} */
         @Override
-        public int compare(final Object o1, final Object o2) {
+        public int compare(final T o1, final T o2) {
             
             final int weight1 = principalWeightMap.containsKey(o1) ? principalWeightMap.get(o1) : 0;
             final int weight2 = principalWeightMap.containsKey(o2) ? principalWeightMap.get(o2) : 0;
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/MultiFactorAuthenticationTransition.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/MultiFactorAuthenticationTransition.java
index 26a0abb..a861f22 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/MultiFactorAuthenticationTransition.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/MultiFactorAuthenticationTransition.java
@@ -68,9 +68,8 @@ public class MultiFactorAuthenticationTransition {
     @Nonnull public Function<ProfileRequestContext,String> getNextFlowStrategy(@Nonnull @NotEmpty final String event) {
         if (nextFlowStrategyMap.containsKey(event)) {
             return nextFlowStrategyMap.get(event);
-        } else {
-            return FunctionSupport.constant(null);
         }
+        return FunctionSupport.constant(null);
     }
     
     /**
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/RequestedPrincipalContext.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/RequestedPrincipalContext.java
index 1e0a2d9..c7ba481 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/RequestedPrincipalContext.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/RequestedPrincipalContext.java
@@ -232,7 +232,7 @@ public final class RequestedPrincipalContext extends BaseContext {
                 final HashSet<T> set = new HashSet<>();
                 for (final Principal p : principals) {
                     if (c.isAssignableFrom(p.getClass())) {
-                        set.add((T)p);
+                        set.add(c.cast(p));
                     }
                 }
                 return set;
@@ -253,10 +253,9 @@ public final class RequestedPrincipalContext extends BaseContext {
         return isAcceptable(new PrincipalSupportingComponent() {
             public <TT extends Principal> Set<TT> getSupportedPrincipals(final Class<TT> c) {
                 if (c.isAssignableFrom(principal.getClass())) {
-                    return Collections.singleton((TT) principal);
-                } else {
-                    return Collections.emptySet();
+                    return Collections.singleton(c.cast(principal));
                 }
+                return Collections.emptySet();
             }
         });
     }
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/PreviousResultLookupFunction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/PreviousResultLookupFunction.java
index 4c4ede8..c2acf6b 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/PreviousResultLookupFunction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/PreviousResultLookupFunction.java
@@ -30,13 +30,11 @@ import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 public class PreviousResultLookupFunction implements ContextDataLookupFunction<AuthenticationContext,Boolean> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Boolean apply(@Nullable final AuthenticationContext input) {
         if (input != null && input.getAuthenticationResult() != null) {
             return input.getAuthenticationResult().isPreviousResult();
-        } else {
-            return null;
         }
+        return null;
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextImpersonatingPrincipalLookupFunction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextImpersonatingPrincipalLookupFunction.java
index d089071..f9741e3 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextImpersonatingPrincipalLookupFunction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextImpersonatingPrincipalLookupFunction.java
@@ -28,7 +28,6 @@ public class SubjectContextImpersonatingPrincipalLookupFunction
         implements ContextDataLookupFunction<SubjectContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final SubjectContext input) {
         
         if (input != null) {
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextPrincipalLookupFunction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextPrincipalLookupFunction.java
index 3996d1a..10e58c3 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextPrincipalLookupFunction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/navigate/SubjectContextPrincipalLookupFunction.java
@@ -27,7 +27,6 @@ import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 public class SubjectContextPrincipalLookupFunction implements ContextDataLookupFunction<SubjectContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final SubjectContext input) {
         
         if (input != null) {
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/DefaultPrincipalDeterminationStrategy.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/DefaultPrincipalDeterminationStrategy.java
index bd96926..4ecb5f1 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/DefaultPrincipalDeterminationStrategy.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/DefaultPrincipalDeterminationStrategy.java
@@ -97,9 +97,8 @@ public class DefaultPrincipalDeterminationStrategy<T extends Principal> implemen
         final Set<T> principals = ac.getAuthenticationResult().getSupportedPrincipals(principalType);
         if (principals.isEmpty()) {
             return defaultPrincipal;
-        } else {
-            return descriptor.getHighestWeighted(principals); 
         }
+        return descriptor.getHighestWeighted(principals);
     }
     
 }
\ No newline at end of file
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactoryRegistry.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactoryRegistry.java
index 6d66494..785235a 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactoryRegistry.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactoryRegistry.java
@@ -76,17 +76,16 @@ public final class PrincipalEvalPredicateFactoryRegistry {
         final String trimmed =
                 Constraint.isNotNull(StringSupport.trimOrNull(operator), "Operator cannot be null or empty");
         
-        final Pair key = new Pair<>(principalType, trimmed);
+        final Pair<?,?> key = new Pair<>(principalType, trimmed);
         final PrincipalEvalPredicateFactory factory = registry.get(key);
         if (factory != null) {
             log.debug("Registry located predicate factory of type '{}' for principal type '{}' and operator '{}'",
                     factory.getClass().getName(), principalType, trimmed);
             return factory;
-        } else {
-            log.debug("Registry failed to locate predicate factory for principal type '{}' and operator '{}'",
-                    principalType, trimmed);
-            return null;
         }
+        log.debug("Registry failed to locate predicate factory for principal type '{}' and operator '{}'",
+                principalType, trimmed);
+        return null;
     }
     
     /**
diff --git a/idp-authn-impl/.settings/org.eclipse.jdt.core.prefs b/idp-authn-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-authn-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-authn-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoAuthAuthenticator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoAuthAuthenticator.java
index 573b8d9..51ab40f 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoAuthAuthenticator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoAuthAuthenticator.java
@@ -54,7 +54,7 @@ public class DuoAuthAuthenticator extends AbstractDuoAuthenticator {
     
     /** Constructor. */
     public DuoAuthAuthenticator() {
-        wrapperTypeRef = new TypeReference<DuoResponseWrapper<DuoAuthResponse>>() {};
+        wrapperTypeRef = new TypeReference<>() {};
         paramEscaper = UrlEscapers.urlFormParameterEscaper();
     }
     
@@ -90,7 +90,7 @@ public class DuoAuthAuthenticator extends AbstractDuoAuthenticator {
                 rb.addParameter(DuoAuthAPI.DUO_PASSCODE, duoContext.getPasscode());
             }
             if (!duoContext.getPushInfo().isEmpty()) {
-                final ArrayList<String> pushinfo = new ArrayList<String>(duoContext.getPushInfo().size());
+                final ArrayList<String> pushinfo = new ArrayList<>(duoContext.getPushInfo().size());
                 for (final Map.Entry<String,String> entry : duoContext.getPushInfo().entrySet()) {
                     pushinfo.add(paramEscaper.escape(entry.getKey()) + "=" + paramEscaper.escape(entry.getValue()));
                 }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoDevice.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoDevice.java
index 2672f55..e3e23c1 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoDevice.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoDevice.java
@@ -51,7 +51,7 @@ public class DuoDevice {
 
     /** Constructor. */
     public DuoDevice() {
-        capabilities = new ArrayList<String>();
+        capabilities = new ArrayList<>();
     }
 
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPreauthAuthenticator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPreauthAuthenticator.java
index 060d8d6..c5ce262 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPreauthAuthenticator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPreauthAuthenticator.java
@@ -47,7 +47,7 @@ public class DuoPreauthAuthenticator extends AbstractDuoAuthenticator {
 
     /** Constructor. */
     public DuoPreauthAuthenticator() {
-        wrapperTypeRef = new TypeReference<DuoResponseWrapper<DuoPreauthResponse>>() {};
+        wrapperTypeRef = new TypeReference<>() {};
     }
 
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPrincipalSerializer.java
index 95fd3dc..fe865c5 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoPrincipalSerializer.java
@@ -26,6 +26,7 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonReader;
 import javax.json.JsonString;
@@ -57,50 +58,44 @@ public class DuoPrincipalSerializer extends AbstractPrincipalSerializer<String>
     @Nonnull private final Logger log = LoggerFactory.getLogger(DuoPrincipalSerializer.class);
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         return principal instanceof DuoPrincipal;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject()
-            .write(DUO_FIELD, principal.getName())
-            .writeEnd();
-        gen.close();
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject()
+                .write(DUO_FIELD, principal.getName())
+                .writeEnd();
+        }
         return sink.toString();
     }
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public DuoPrincipal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing DuoPrincipal");
-        }
-        final JsonString str = ((JsonObject) st).getJsonString(DUO_FIELD);
-        if (str != null) {
-            final String username = str.getString();
-            if (!Strings.isNullOrEmpty(username)) {
-                return new DuoPrincipal(username);
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing DuoPrincipal");
+            }
+            final JsonString str = ((JsonObject) st).getJsonString(DUO_FIELD);
+            if (str != null) {
+                final String username = str.getString();
+                if (!Strings.isNullOrEmpty(username)) {
+                    return new DuoPrincipal(username);
+                }
             }
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing DuoPrincipal", e);
         }
-        return null;
     }
 
 }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoSupport.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoSupport.java
index 1ebcd1a..7d9081e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoSupport.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/DuoSupport.java
@@ -179,7 +179,7 @@ public final class DuoSupport {
     private static String createQueryString(@Nonnull final List<NameValuePair> params)
             throws UnsupportedEncodingException {
 
-        final ArrayList<String> args = new ArrayList<String>();
+        final ArrayList<String> args = new ArrayList<>();
 
         // sort by name
         Collections.sort(params, new Comparator<NameValuePair>() {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializer.java
index eef54aa..99cbbab 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializer.java
@@ -155,7 +155,6 @@ public class DefaultAuthenticationResultSerializer extends AbstractInitializable
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final AuthenticationResult instance) throws IOException {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         
@@ -202,20 +201,15 @@ public class DefaultAuthenticationResultSerializer extends AbstractInitializable
     
     // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nonnull public AuthenticationResult deserialize(final long version, @Nonnull @NotEmpty final String context,
                     @Nonnull @NotEmpty final String key, @Nonnull @NotEmpty final String value,
                     @Nullable final Long expiration) throws IOException {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         
-        try {
-            final JsonReader reader = readerFactory.createReader(new StringReader(value));
-            JsonStructure st = null;
-            try {
-                st = reader.read();
-            } finally {
-                reader.close();
-            }
+        try (final JsonReader reader = readerFactory.createReader(new StringReader(value))) {
+            
+            final JsonStructure st = reader.read();
+            
             if (!(st instanceof JsonObject)) {
                 throw new IOException("Found invalid data structure while parsing AuthenticationResult");
             }
@@ -282,22 +276,17 @@ public class DefaultAuthenticationResultSerializer extends AbstractInitializable
         boolean serialized = false;
         for (final PrincipalSerializer<String> serializer : principalSerializers) {
             if (serializer.supports(principal)) {
-                final JsonReader reader = readerFactory.createReader(new StringReader(serializer.serialize(principal)));
-                try {
+                try (final JsonReader reader =
+                        readerFactory.createReader(new StringReader(serializer.serialize(principal)))) {
                     generator.write(reader.readObject());
-                } finally {
-                    reader.close();
                 }
                 serialized = true;
             }
         }
         if (!serialized && genericSerializer.supports(principal)) {
-            final JsonReader reader =
-                    readerFactory.createReader(new StringReader(genericSerializer.serialize(principal)));
-            try {
+            try (final JsonReader reader =
+                    readerFactory.createReader(new StringReader(genericSerializer.serialize(principal)))) {
                 generator.write(reader.readObject());
-            } finally {
-                reader.close();
             }
         }
     }
@@ -313,7 +302,7 @@ public class DefaultAuthenticationResultSerializer extends AbstractInitializable
     @Nullable private Principal deserializePrincipal(@Nonnull final JsonValue jsonValue) throws IOException {
         if (jsonValue instanceof JsonObject) {
             final String json = ((JsonObject) jsonValue).toString();
-            for (final PrincipalSerializer serializer : principalSerializers) {
+            for (final PrincipalSerializer<? super String> serializer : principalSerializers) {
                 if (serializer.supports(json)) {
                     return serializer.deserialize(json);
                 }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
index f88deec..b8ebdb3 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
@@ -184,16 +184,16 @@ public class DoLockoutManagerOperation extends AbstractProfileAction {
                     final boolean lockout = lockoutManager.check(profileRequestContext);
                     response.setStatus(HttpServletResponse.SC_OK);
                     final JsonFactory jsonFactory = new JsonFactory();
-                    final JsonGenerator g = jsonFactory.createGenerator(
-                            response.getOutputStream()).useDefaultPrettyPrinter();
-                    g.setCodec(objectMapper);
-                    g.writeStartObject();
-                    g.writeObjectFieldStart("data");
-                    g.writeStringField("type", "lockout-statuses");
-                    g.writeStringField("id", managerId + '/' + key);
-                    g.writeObjectFieldStart("attributes");
-                    g.writeBooleanField("lockout", lockout);
-                    g.close();
+                    try (final JsonGenerator g = jsonFactory.createGenerator(
+                            response.getOutputStream()).useDefaultPrettyPrinter()) {
+                        g.setCodec(objectMapper);
+                        g.writeStartObject();
+                        g.writeObjectFieldStart("data");
+                        g.writeStringField("type", "lockout-statuses");
+                        g.writeStringField("id", managerId + '/' + key);
+                        g.writeObjectFieldStart("attributes");
+                        g.writeBooleanField("lockout", lockout);
+                    }
                 } catch (final IOException e) {
                     sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal Server Error",
                             "Lockout manager error.");
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
index 44e97a6..83f7263 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
@@ -183,7 +183,7 @@ public class FinalizeAuthentication extends AbstractAuthenticationAction {
             
             sc.setPrincipalName(canonicalPrincipalName);
     
-            final Map scResults = sc.getAuthenticationResults();
+            final Map<String,AuthenticationResult> scResults = sc.getAuthenticationResults();
             scResults.putAll(authenticationContext.getActiveResults());
             
             final AuthenticationResult latest = authenticationContext.getAuthenticationResult();
@@ -254,11 +254,11 @@ public class FinalizeAuthentication extends AbstractAuthenticationAction {
         
         if (matches.isEmpty()) {
             return null;
-        } else {
-            final AuthenticationFlowDescriptor flowDescriptor = authenticationContext.getAvailableFlows().get(
-                    authenticationContext.getAuthenticationResult().getAuthenticationFlowId());
-            return flowDescriptor.getHighestWeighted(matches);
         }
+        
+        final AuthenticationFlowDescriptor flowDescriptor = authenticationContext.getAvailableFlows().get(
+                authenticationContext.getAuthenticationResult().getAuthenticationFlowId());
+        return flowDescriptor.getHighestWeighted(matches);
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
index c955a45..bd1d824 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeMultiFactorAuthentication.java
@@ -87,8 +87,8 @@ public class FinalizeMultiFactorAuthentication extends AbstractAuthenticationAct
     /** Constructor. */
     public FinalizeMultiFactorAuthentication() {
         multiFactorContextLookupStrategy =
-                new ChildContextLookup(MultiFactorAuthenticationContext.class).compose(
-                        new ChildContextLookup(AuthenticationContext.class));
+                new ChildContextLookup<>(MultiFactorAuthenticationContext.class).compose(
+                        new ChildContextLookup<>(AuthenticationContext.class));
                 
         requesterLookupStrategy = new RelyingPartyIdLookupFunction();
         responderLookupStrategy = new ResponderIdLookupFunction();
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/JAASCredentialValidator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/JAASCredentialValidator.java
index 2bbb55a..9a3ca1e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/JAASCredentialValidator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/JAASCredentialValidator.java
@@ -142,7 +142,7 @@ public class JAASCredentialValidator extends AbstractUsernamePasswordCredentialV
                     } else {
                         final Subject subject = new Subject();
                         subject.getPrincipals().addAll(config.getSecond());
-                        loginConfigurations.add(new Pair<String,Subject>(trimmed, subject));
+                        loginConfigurations.add(new Pair<>(trimmed, subject));
                     }
                 }
             }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/KerberosCredentialValidator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/KerberosCredentialValidator.java
index 1179595..31d1421 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/KerberosCredentialValidator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/KerberosCredentialValidator.java
@@ -191,8 +191,8 @@ public class KerberosCredentialValidator extends AbstractUsernamePasswordCredent
                 final Subject subject = new Subject();
                 final LoginModule clientLoginModule = (LoginModule) Class.forName(loginModuleClassName).
                         getDeclaredConstructor().newInstance();
-                clientLoginModule.initialize(subject, new SimpleCallbackHandler(usernamePasswordContext), new HashMap(),
-                        clientOptions);
+                clientLoginModule.initialize(subject, new SimpleCallbackHandler(usernamePasswordContext),
+                        new HashMap<>(), clientOptions);
                 if (!clientLoginModule.login() || !clientLoginModule.commit()) {
                     clientLoginModule.abort();
                     throw new LoginException("Login module reported failure");
@@ -264,7 +264,7 @@ public class KerberosCredentialValidator extends AbstractUsernamePasswordCredent
             serverLoginModule = (LoginModule) Class.forName(loginModuleClassName).
                     getDeclaredConstructor().newInstance();
             final Subject serverSubject = new Subject();
-            serverLoginModule.initialize(serverSubject, null, new HashMap(), serverOptions);
+            serverLoginModule.initialize(serverSubject, null, new HashMap<>(), serverOptions);
             if (!serverLoginModule.login() || !serverLoginModule.commit()) {
                 serverLoginModule.abort();
                 throw new LoginException("Login module reported failure");
@@ -281,11 +281,11 @@ public class KerberosCredentialValidator extends AbstractUsernamePasswordCredent
             // so that the null credential above indicating the default credentials pulls from the JAAS subject.
             final byte[] token = Subject.doAs(subject, new PrivilegedExceptionAction<byte[]>() {
                 public byte[] run() throws GSSException {
-                    final byte[] token = new byte[0];
+                    final byte[] itoken = new byte[0];
                     // This is a one pass context initialization.
                     context.requestMutualAuth(false);
                     context.requestCredDeleg(false);
-                    return context.initSecContext(token, 0, token.length);
+                    return context.initSecContext(itoken, 0, itoken.length);
                 }
             });
             
@@ -313,9 +313,8 @@ public class KerberosCredentialValidator extends AbstractUsernamePasswordCredent
         } catch (final PrivilegedActionException e) {
             if (e.getException() != null) {
                 throw e.getException();
-            } else {
-                throw e;
             }
+            throw e;
         } finally {
             if (serverLoginModule != null) {
                 serverLoginModule.logout();
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
index 2562079..b9e19f1 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
@@ -157,30 +157,30 @@ public class LDAPCredentialValidator extends AbstractUsernamePasswordCredentialV
                     }
                 }
                 return populateSubject(usernamePasswordContext, response);
+            }
+            
+            log.info("{} Login by '{}' failed", getLogPrefix(), username);
+            authenticationContext.getSubcontext(
+                    LDAPResponseContext.class, true).setAuthenticationResponse(response);
+            if (AuthenticationResultCode.DN_RESOLUTION_FAILURE == response.getAuthenticationResultCode()
+                    || AuthenticationResultCode.INVALID_CREDENTIAL == response.getAuthenticationResultCode()) {
+                throw new LdapException(
+                        String.format("%s:%s", response.getAuthenticationResultCode(), response.getMessage()));
+            } else if (response.getAccountState() != null) {
+                final AccountState state = response.getAccountState();
+                eventToSignal = AuthnEventIds.ACCOUNT_ERROR;
+                throw new LdapException(
+                        String.format("%s:%s:%s", state.getError(), response.getResultCode(), response.getMessage())
+                        );
+            } else if (response.getResultCode() == ResultCode.INVALID_CREDENTIALS) {
+                throw new LdapException(String.format("%s:%s", response.getResultCode(), response.getMessage()));
             } else {
-                log.info("{} Login by '{}' failed", getLogPrefix(), username);
-                authenticationContext.getSubcontext(
-                        LDAPResponseContext.class, true).setAuthenticationResponse(response);
-                if (AuthenticationResultCode.DN_RESOLUTION_FAILURE == response.getAuthenticationResultCode()
-                        || AuthenticationResultCode.INVALID_CREDENTIAL == response.getAuthenticationResultCode()) {
-                    throw new LdapException(
-                            String.format("%s:%s", response.getAuthenticationResultCode(), response.getMessage()));
-                } else if (response.getAccountState() != null) {
-                    final AccountState state = response.getAccountState();
-                    eventToSignal = AuthnEventIds.ACCOUNT_ERROR;
-                    throw new LdapException(
-                            String.format("%s:%s:%s", state.getError(), response.getResultCode(), response.getMessage())
-                            );
-                } else if (response.getResultCode() == ResultCode.INVALID_CREDENTIALS) {
-                    throw new LdapException(String.format("%s:%s", response.getResultCode(), response.getMessage()));
-                } else {
-                    eventToSignal = AuthnEventIds.AUTHN_EXCEPTION;
-                    final LdapException e =
-                            new LdapException(response.getMessage(), response.getResultCode(), response.getMatchedDn(),
-                            response.getControls(), response.getReferralURLs(), response.getMessageId());
-                    log.warn("{} Login by {} produced exception", getLogPrefix(), username, e);
-                    throw e;
-                }
+                eventToSignal = AuthnEventIds.AUTHN_EXCEPTION;
+                final LdapException e =
+                        new LdapException(response.getMessage(), response.getResultCode(), response.getMatchedDn(),
+                        response.getControls(), response.getReferralURLs(), response.getMessageId());
+                log.warn("{} Login by {} produced exception", getLogPrefix(), username, e);
+                throw e;
             }
         } catch (final LdapException e) {
             if (errorHandler != null) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContext.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContext.java
index f549e5c..8045485 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContext.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContext.java
@@ -82,8 +82,8 @@ public class PopulateMultiFactorAuthenticationContext extends AbstractAuthentica
     PopulateMultiFactorAuthenticationContext() {
         transitionMapLookupStrategy = FunctionSupport.constant(null);
         multiFactorContextCreationStrategy =
-                new ChildContextLookup(MultiFactorAuthenticationContext.class, true).compose(
-                        new ChildContextLookup(AuthenticationContext.class));
+                new ChildContextLookup<>(MultiFactorAuthenticationContext.class, true).compose(
+                        new ChildContextLookup<>(AuthenticationContext.class));
         activeResultLookupStrategy = new DefaultResultLookupStrategy();
     }
     
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/RemoteUserAuthServlet.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/RemoteUserAuthServlet.java
index e265a96..8ef675a 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/RemoteUserAuthServlet.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/RemoteUserAuthServlet.java
@@ -244,9 +244,8 @@ public class RemoteUserAuthServlet extends HttpServlet {
                     httpRequest.setAttribute(ExternalAuthentication.SUBJECT_KEY, subject);
                     ExternalAuthentication.finishExternalAuthentication(key, httpRequest, httpResponse);
                     return;
-                } else {
-                    log.info("Java Subject not found in attribute {}", subjectAttribute);
                 }
+                log.info("Java Subject not found in attribute {}", subjectAttribute);
             }
             
             String username = null;
@@ -329,10 +328,9 @@ public class RemoteUserAuthServlet extends HttpServlet {
                         httpRequest.setAttribute(ExternalAuthentication.SUBJECT_KEY, subject);
                         ExternalAuthentication.finishExternalAuthentication(key, httpRequest, httpResponse);
                         return;
-                    } else {
-                        log.error("Unable to locate AuthenticationFlowDescriptor, can't process "
-                                + "authentication methods from header");
                     }
+                    log.error("Unable to locate AuthenticationFlowDescriptor, can't process "
+                            + "authentication methods from header");
                 }
                 
                 httpRequest.setAttribute(ExternalAuthentication.PRINCIPAL_NAME_KEY, username);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlow.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlow.java
index 652d76d..383c99d 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlow.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlow.java
@@ -475,49 +475,49 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
             selectRequestedInactiveFlow(profileRequestContext, authenticationContext);
             return;
 
-        } else {
-            final Map<String,AuthenticationFlowDescriptor> potentialFlows = authenticationContext.getPotentialFlows();
+        }
+        
+        final Map<String,AuthenticationFlowDescriptor> potentialFlows = authenticationContext.getPotentialFlows();
 
-            // In this branch, we check each flow for compatibility *and* then double check to see if an active
-            // result from that flow also exists and is compatible. This favors a matching inactive flow that is
-            // higher in request precedence than an active result.
-            for (final Principal p : requestedPrincipalCtx.getRequestedPrincipals()) {
-                log.debug("{} Checking for an inactive flow or active result compatible with "
-                        + "operator '{}' and principal '{}'", getLogPrefix(), requestedPrincipalCtx.getOperator(),
-                        p.getName());
-                final PrincipalEvalPredicate predicate = requestedPrincipalCtx.getPredicate(p);
-                if (predicate != null) {
-                    for (final AuthenticationFlowDescriptor descriptor : potentialFlows.values()) {
-                        if (!authenticationContext.getIntermediateFlows().containsKey(descriptor.getId())
-                                && predicate.test(descriptor) && descriptor.test(profileRequestContext)) {
-                            
-                            // Now check for an active result we can use from this flow. Not all results from a flow
-                            // will necessarily match the request just because the flow might.
-                            final AuthenticationResult result = activeResults.get(descriptor.getId());
-                            if (result == null || !descriptor.getReuseCondition().test(profileRequestContext)
-                                    || !predicate.test(result)) {
-                                if (!authenticationContext.isPassive()
-                                        || descriptor.isPassiveAuthenticationSupported()) {
-                                    selectInactiveFlow(profileRequestContext, authenticationContext, descriptor);
-                                    return;
-                                }
-                            } else {
-                                selectActiveResult(profileRequestContext, authenticationContext, result);
+        // In this branch, we check each flow for compatibility *and* then double check to see if an active
+        // result from that flow also exists and is compatible. This favors a matching inactive flow that is
+        // higher in request precedence than an active result.
+        for (final Principal p : requestedPrincipalCtx.getRequestedPrincipals()) {
+            log.debug("{} Checking for an inactive flow or active result compatible with "
+                    + "operator '{}' and principal '{}'", getLogPrefix(), requestedPrincipalCtx.getOperator(),
+                    p.getName());
+            final PrincipalEvalPredicate predicate = requestedPrincipalCtx.getPredicate(p);
+            if (predicate != null) {
+                for (final AuthenticationFlowDescriptor descriptor : potentialFlows.values()) {
+                    if (!authenticationContext.getIntermediateFlows().containsKey(descriptor.getId())
+                            && predicate.test(descriptor) && descriptor.test(profileRequestContext)) {
+                        
+                        // Now check for an active result we can use from this flow. Not all results from a flow
+                        // will necessarily match the request just because the flow might.
+                        final AuthenticationResult result = activeResults.get(descriptor.getId());
+                        if (result == null || !descriptor.getReuseCondition().test(profileRequestContext)
+                                || !predicate.test(result)) {
+                            if (!authenticationContext.isPassive()
+                                    || descriptor.isPassiveAuthenticationSupported()) {
+                                selectInactiveFlow(profileRequestContext, authenticationContext, descriptor);
                                 return;
                             }
+                        } else {
+                            selectActiveResult(profileRequestContext, authenticationContext, result);
+                            return;
                         }
                     }
-                } else {
-                    log.warn("{} Configuration does not support requested principal evaluation with "
-                            + "operator '{}' and type '{}'", getLogPrefix(), requestedPrincipalCtx.getOperator(),
-                            p.getClass());
                 }
+            } else {
+                log.warn("{} Configuration does not support requested principal evaluation with "
+                        + "operator '{}' and type '{}'", getLogPrefix(), requestedPrincipalCtx.getOperator(),
+                        p.getClass());
             }
-            
-            log.info("{} None of the potential authentication flows can satisfy the request", getLogPrefix());
-            ActionSupport.buildEvent(profileRequestContext,
-                    authenticationContext.isPassive() ? AuthnEventIds.NO_PASSIVE : AuthnEventIds.REQUEST_UNSUPPORTED);
         }
+        
+        log.info("{} None of the potential authentication flows can satisfy the request", getLogPrefix());
+        ActionSupport.buildEvent(profileRequestContext,
+                authenticationContext.isPassive() ? AuthnEventIds.NO_PASSIVE : AuthnEventIds.REQUEST_UNSUPPORTED);
     }
 // Checkstyle: MethodLength|CyclomaticComplexity|ReturnCount ON
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalization.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalization.java
index dab0137..19a07f1 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalization.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalization.java
@@ -128,9 +128,9 @@ public class SimpleSubjectCanonicalization extends AbstractSubjectCanonicalizati
                 }
                 
                 return true;
-            } else {
-                return usernames != null && usernames.size() == 1;
             }
+            
+            return usernames != null && usernames.size() == 1;
         }
         
     }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManager.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManager.java
index 4b43bf1..cfb9b3d 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManager.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManager.java
@@ -228,7 +228,7 @@ public class StorageBackedAccountLockoutManager extends AbstractIdentifiableInit
 
         // Read back account state. No state obviously means no lockout, but in the case of errors
         // that does fail open. Of course, in-memory won't fail...
-        StorageRecord sr = null;
+        StorageRecord<?> sr = null;
         try {
             sr = storageService.read(getId(), key);
         } catch (final IOException e) {
@@ -256,9 +256,8 @@ public class StorageBackedAccountLockoutManager extends AbstractIdentifiableInit
                         doIncrement(profileRequestContext, key, 10);
                     }
                     return true;
-                } else {
-                    log.debug("Lockout for '{}' has elapsed", key);
                 }
+                log.debug("Lockout for '{}' has elapsed", key);
             } else {
                 log.debug("Invalid attempts counter for '{}' has only reached {}", key, counter);
             }
@@ -289,9 +288,8 @@ public class StorageBackedAccountLockoutManager extends AbstractIdentifiableInit
                 log.debug("Clearing lockout state for '{}'", key);
                 storageService.delete(getId(), key);
                 return true;
-            } else {
-                log.warn("No lockout key returned for request");
             }
+            log.warn("No lockout key returned for request");
         } catch (final IOException e) {
             log.error("Error deleting lockout entry", e);
         }
@@ -320,7 +318,7 @@ public class StorageBackedAccountLockoutManager extends AbstractIdentifiableInit
         log.debug("Reading account lockout data for '{}'", key);
         
         int counter = 0;
-        StorageRecord sr = null;
+        StorageRecord<?> sr = null;
         try {
             sr = storageService.read(getId(), key);
             if (sr != null) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/TransitionMultiFactorAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/TransitionMultiFactorAuthentication.java
index 8916ba7..d1aa4fb 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/TransitionMultiFactorAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/TransitionMultiFactorAuthentication.java
@@ -104,8 +104,8 @@ public class TransitionMultiFactorAuthentication extends AbstractAuthenticationA
     /** Constructor. */
     TransitionMultiFactorAuthentication() {
         multiFactorContextLookupStrategy =
-                new ChildContextLookup(MultiFactorAuthenticationContext.class).compose(
-                        new ChildContextLookup(AuthenticationContext.class));
+                new ChildContextLookup<>(MultiFactorAuthenticationContext.class).compose(
+                        new ChildContextLookup<>(AuthenticationContext.class));
         
         eventContextLookupStrategy = new WebFlowCurrentEventLookupFunction();
         
@@ -272,10 +272,9 @@ public class TransitionMultiFactorAuthentication extends AbstractAuthenticationA
                 ActionSupport.buildProceedEvent(profileRequestContext);
                 doExecute(profileRequestContext, authenticationContext);
                 return;
-            } else {
-                log.debug("{} Condition blocked reuse of active result for '{}' flow", getLogPrefix(), flowId);
-                mfaContext.getActiveResults().remove(flowId);
             }
+            log.debug("{} Condition blocked reuse of active result for '{}' flow", getLogPrefix(), flowId);
+            mfaContext.getActiveResults().remove(flowId);
         }
      
         if (validateLoginTransitions) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
index eed3367..5af7892 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
@@ -267,14 +267,14 @@ public class ValidateExternalAuthentication extends AbstractValidationAction {
             if (princs != null && !princs.isEmpty()) {
                 if (matchExpression.matcher(princs.iterator().next().getName()).matches()) {
                     return true;
-                } else {
-                    log.info("{} Username did not match expression", getLogPrefix());
-                    return false;
                 }
-            } else {
-                log.info("{} Match expression set, but not UsernamePrincipal found");
+                
+                log.info("{} Username did not match expression", getLogPrefix());
                 return false;
             }
+            
+            log.info("{} Match expression set, but not UsernamePrincipal found");
+            return false;
         }
         
         return true;
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateRemoteUser.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateRemoteUser.java
index cee08d7..833e61f 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateRemoteUser.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateRemoteUser.java
@@ -178,14 +178,13 @@ public class ValidateRemoteUser extends AbstractValidationAction {
             // Not in whitelist. Only accept if a regexp applies.
             if (matchExpression == null) {
                 return false;
-            } else {
-                return matchExpression.matcher(username).matches();
             }
-        } else {
-            // In whitelist (or none). Check blacklist, and if necessary a regexp.
-            return !blacklistedUsernames.contains(username)
-                    && (matchExpression == null || matchExpression.matcher(username).matches());
+            return matchExpression.matcher(username).matches();
         }
+        
+        // In whitelist (or none). Check blacklist, and if necessary a regexp.
+        return !blacklistedUsernames.contains(username)
+                && (matchExpression == null || matchExpression.matcher(username).matches());
     }
 
     /** {@inheritDoc} */
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddress.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddress.java
index 8fad321..18e43be 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddress.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddress.java
@@ -94,7 +94,7 @@ public class ValidateUserAgentAddress extends AbstractValidationAction {
     public void setMappings(@Nonnull @NonnullElements final Map<String,Collection<IPRange>> newMappings) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
-        mappings = new HashMap(newMappings.size());
+        mappings = new HashMap<>(newMappings.size());
         for (final Map.Entry<String,Collection<IPRange>> e : newMappings.entrySet()) {
             if (!Strings.isNullOrEmpty(e.getKey())) {
                 mappings.put(e.getKey(), new ArrayList<>(Collections2.filter(e.getValue(), Predicates.notNull())));
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
index f75a6ab..6a2d171 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalization.java
@@ -158,7 +158,7 @@ public class X500SubjectCanonicalization extends AbstractSubjectCanonicalization
 
         if (certificate != null && !subjectAltNameTypes.isEmpty()) {
             log.debug("{} Searching for subjectAltName types ({})", getLogPrefix(), subjectAltNameTypes);
-            final List altnames = X509Support.getAltNames(certificate, subjectAltNameTypes.toArray(new Integer[0]));
+            final List<?> altnames = X509Support.getAltNames(certificate, subjectAltNameTypes.toArray(new Integer[0]));
             for (final Object altname : altnames) {
                 if (altname instanceof String) {
                     log.debug("{} Extracted String-valued subjectAltName: {}", getLogPrefix(), altname);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
index b753042..2143f67 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
@@ -89,7 +89,7 @@ public class X509AuthServlet extends HttpServlet {
             log.debug("Looking up TrustEngine bean: {}", param);
             final Object bean = springContext.getBean(param);
             if (bean instanceof TrustEngine) {
-                trustEngine = (TrustEngine) bean;
+                trustEngine = (TrustEngine<? super X509Credential>) bean;
             } else {
                 throw new ServletException("Bean " + param + " was missing, or not a TrustManager");
             }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
index 31f374b..ace3af8 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
@@ -97,7 +97,7 @@ public class X509ProxyFilter implements Filter {
                     (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
             
             if (null == certs || 0 == certs.length) {
-                final List<X509Certificate> proxyCerts = new ArrayList<X509Certificate>();
+                final List<X509Certificate> proxyCerts = new ArrayList<>();
 
                 if (leafHeader != null) {
                     final String pem = httpRequest.getHeader(leafHeader);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/AuthenticationResultPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/AuthenticationResultPrincipalSerializer.java
index 9eb5639..54577f7 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/AuthenticationResultPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/AuthenticationResultPrincipalSerializer.java
@@ -29,6 +29,7 @@ import javax.annotation.concurrent.ThreadSafe;
 import javax.json.Json;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonReader;
@@ -80,57 +81,51 @@ public class AuthenticationResultPrincipalSerializer extends AbstractPrincipalSe
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         return principal instanceof AuthenticationResultPrincipal;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         final StringWriter sink = new StringWriter(128);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject();   
-        
-        final AuthenticationResult result = ((AuthenticationResultPrincipal) principal).getAuthenticationResult();
-        
-        gen.write(PRINCIPAL_NAME_FIELD, resultSerializer.serialize(result));
-        
-        gen.writeEnd();
-        gen.close();
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject();   
+            
+            final AuthenticationResult result = ((AuthenticationResultPrincipal) principal).getAuthenticationResult();
+            
+            gen.write(PRINCIPAL_NAME_FIELD, resultSerializer.serialize(result));
+            
+            gen.writeEnd();
+        }
         return sink.toString();
     }
         
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public AuthenticationResultPrincipal deserialize(@Nonnull @NotEmpty final String value)
             throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing AuthenticationResultPrincipal");
-        }
-        final JsonObject obj = (JsonObject) st;
-        final JsonValue str = obj.get(PRINCIPAL_NAME_FIELD);
-        if (str != null && str instanceof JsonString) {
-            return new AuthenticationResultPrincipal(
-                    resultSerializer.deserialize(1, "context", "key", ((JsonString) str).getString(), null));
-        } else {
+        
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing AuthenticationResultPrincipal");
+            }
+            final JsonObject obj = (JsonObject) st;
+            final JsonValue str = obj.get(PRINCIPAL_NAME_FIELD);
+            if (str != null && str instanceof JsonString) {
+                return new AuthenticationResultPrincipal(
+                        resultSerializer.deserialize(1, "context", "key", ((JsonString) str).getString(), null));
+            }
             log.warn("Skipping non-string principal value");
+            
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing AuthenticationResultPrincipal", e);
         }
-        
-        return null;
     }
 
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/GenericPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/GenericPrincipalSerializer.java
index e5008de..fea7f93 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/GenericPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/GenericPrincipalSerializer.java
@@ -31,6 +31,7 @@ import java.util.regex.Pattern;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import javax.json.JsonException;
 import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonReader;
@@ -98,7 +99,6 @@ public class GenericPrincipalSerializer extends AbstractPrincipalSerializer<Stri
     }
         
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         final Class<? extends Principal> principalType = principal.getClass();
         if (compatiblePrincipalTypes.contains(principalType)) {
@@ -117,77 +117,73 @@ public class GenericPrincipalSerializer extends AbstractPrincipalSerializer<Stri
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject();
         
-        Integer symbol = symbolics.get(principal.getClass().getName());
-        if (symbol != null) {
-            gen.write(PRINCIPAL_TYPE_FIELD, symbol);
-        } else {
-            gen.write(PRINCIPAL_TYPE_FIELD, principal.getClass().getName());
-        }
-        
-        symbol = symbolics.get(principal.getName());
-        if (symbol != null) {
-            gen.write(PRINCIPAL_NAME_FIELD, symbol);
-        } else {
-            gen.write(PRINCIPAL_NAME_FIELD, principal.getName());
-        }
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject();
+            
+            Integer symbol = symbolics.get(principal.getClass().getName());
+            if (symbol != null) {
+                gen.write(PRINCIPAL_TYPE_FIELD, symbol);
+            } else {
+                gen.write(PRINCIPAL_TYPE_FIELD, principal.getClass().getName());
+            }
             
-        gen.writeEnd();
-        gen.close();
+            symbol = symbolics.get(principal.getName());
+            if (symbol != null) {
+                gen.write(PRINCIPAL_NAME_FIELD, symbol);
+            } else {
+                gen.write(PRINCIPAL_NAME_FIELD, principal.getName());
+            }
+                
+            gen.writeEnd();
+        }
         return sink.toString();
     }
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Principal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
-        
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing a generic principal");
-        }
-        final JsonObject obj = (JsonObject) st;
-        final JsonValue typefield = obj.get(PRINCIPAL_TYPE_FIELD);
-        final JsonValue namefield = obj.get(PRINCIPAL_NAME_FIELD);
-        if (typefield != null && namefield != null) {
-            final String type = desymbolize(typefield);
-            final String name = desymbolize(namefield);
-            if (!Strings.isNullOrEmpty(type) && !Strings.isNullOrEmpty(name)) {
-                try {
-                    final Class<? extends Principal> pclass = Class.forName(type).asSubclass(Principal.class);
-                    final Constructor<? extends Principal> ctor = pclass.getConstructor(String.class);
-                    return ctor.newInstance(name);
-                } catch (final ClassNotFoundException | NoSuchMethodException | SecurityException
-                            | InstantiationException | IllegalAccessException | IllegalArgumentException
-                            | InvocationTargetException e) {
-                    log.warn("Exception instantiating custom Principal type {} with name {}", type, name, e);
+
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing a generic principal");
+            }
+            final JsonObject obj = (JsonObject) st;
+            final JsonValue typefield = obj.get(PRINCIPAL_TYPE_FIELD);
+            final JsonValue namefield = obj.get(PRINCIPAL_NAME_FIELD);
+            if (typefield != null && namefield != null) {
+                final String type = desymbolize(typefield);
+                final String name = desymbolize(namefield);
+                if (!Strings.isNullOrEmpty(type) && !Strings.isNullOrEmpty(name)) {
+                    try {
+                        final Class<? extends Principal> pclass = Class.forName(type).asSubclass(Principal.class);
+                        final Constructor<? extends Principal> ctor = pclass.getConstructor(String.class);
+                        return ctor.newInstance(name);
+                    } catch (final ClassNotFoundException | NoSuchMethodException | SecurityException
+                                | InstantiationException | IllegalAccessException | IllegalArgumentException
+                                | InvocationTargetException e) {
+                        log.warn("Exception instantiating custom Principal type {} with name {}", type, name, e);
+                    }
+                } else {
+                    log.warn("Unparseable Principal type or name in structure");
                 }
             } else {
-                log.warn("Unparseable Principal type or name in structure");
+                log.warn("Missing Principal type or name in structure");
             }
-        } else {
-            log.warn("Missing Principal type or name in structure");
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing a generic principal", e);
         }
-        return null;
     }
 
     
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/IdPAttributePrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/IdPAttributePrincipalSerializer.java
index 0d6d738..1f9f995 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/IdPAttributePrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/IdPAttributePrincipalSerializer.java
@@ -32,6 +32,7 @@ import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
+import javax.json.JsonException;
 import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
@@ -92,81 +93,77 @@ public class IdPAttributePrincipalSerializer extends AbstractPrincipalSerializer
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         return principal instanceof IdPAttributePrincipal;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         final StringWriter sink = new StringWriter(128);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject()
-           .write(PRINCIPAL_NAME_FIELD, principal.getName());        
-        
-        final IdPAttribute attribute = ((IdPAttributePrincipal) principal).getAttribute();
-        final JsonArrayBuilder arrayBuilder = getJsonArrayBuilder();
-        for (final IdPAttributeValue value : attribute.getValues()) {
-            final JsonObject obj = serializeValue(value);
-            if (obj != null) {
-                arrayBuilder.add(obj);
-            } else {
-                log.warn("Skipping unsupported attribute value type ({})", value.getClass());
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject()
+               .write(PRINCIPAL_NAME_FIELD, principal.getName());        
+            
+            final IdPAttribute attribute = ((IdPAttributePrincipal) principal).getAttribute();
+            final JsonArrayBuilder arrayBuilder = getJsonArrayBuilder();
+            for (final IdPAttributeValue value : attribute.getValues()) {
+                final JsonObject obj = serializeValue(value);
+                if (obj != null) {
+                    arrayBuilder.add(obj);
+                } else {
+                    log.warn("Skipping unsupported attribute value type ({})", value.getClass());
+                }
             }
+            gen.write(PRINCIPAL_ENTRY_FIELD, arrayBuilder.build());
+            gen.writeEnd();
         }
-        gen.write(PRINCIPAL_ENTRY_FIELD, arrayBuilder.build());
-        gen.writeEnd();
-        gen.close();
         return sink.toString();
     }
         
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public IdPAttributePrincipal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing IdPAttributePrincipal");
-        }
-        final JsonObject obj = (JsonObject) st;
-        final JsonString str = obj.getJsonString(PRINCIPAL_NAME_FIELD);
-        final JsonArray vals = obj.getJsonArray(PRINCIPAL_ENTRY_FIELD);
-        if (str != null && !Strings.isNullOrEmpty(str.getString()) && vals != null) {
-            final IdPAttribute attribute = new IdPAttribute(str.getString());
-            final List<IdPAttributeValue> values = new ArrayList<>();
+        
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
             
-            for (final JsonValue entry : vals) {
-                if (entry instanceof JsonObject) {
-                    final IdPAttributeValue attrValue = deserializeValue((JsonObject) entry);
-                    if (attrValue != null) {
-                        values.add(attrValue);
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing IdPAttributePrincipal");
+            }
+            
+            final JsonObject obj = (JsonObject) st;
+            final JsonString str = obj.getJsonString(PRINCIPAL_NAME_FIELD);
+            final JsonArray vals = obj.getJsonArray(PRINCIPAL_ENTRY_FIELD);
+            if (str != null && !Strings.isNullOrEmpty(str.getString()) && vals != null) {
+                final IdPAttribute attribute = new IdPAttribute(str.getString());
+                final List<IdPAttributeValue> values = new ArrayList<>();
+                
+                for (final JsonValue entry : vals) {
+                    if (entry instanceof JsonObject) {
+                        final IdPAttributeValue attrValue = deserializeValue((JsonObject) entry);
+                        if (attrValue != null) {
+                            values.add(attrValue);
+                        } else {
+                            log.warn("Skipping unsupported attribute value serialization");
+                        }
                     } else {
-                        log.warn("Skipping unsupported attribute value serialization");
+                        log.warn("Skipping non-object attribute value array entry");
                     }
-                } else {
-                    log.warn("Skipping non-object attribute value array entry");
                 }
+                
+                attribute.setValues(values);
+                return new IdPAttributePrincipal(attribute);
             }
-            
-            attribute.setValues(values);
-            return new IdPAttributePrincipal(attribute);
-        } else {
             log.warn("Skipping IdPAttributePrincipal missing attribute name or values");
+            
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing IdPAttributePrincipal", e);
         }
-        
-        return null;
     }
 
     /**
@@ -221,9 +218,8 @@ public class IdPAttributePrincipalSerializer extends AbstractPrincipalSerializer
             if (value instanceof JsonNumber) {
                 if (((JsonNumber) value).intValueExact() == 0) {
                     return EmptyAttributeValue.NULL;
-                } else {
-                    return EmptyAttributeValue.ZERO_LENGTH;
                 }
+                return EmptyAttributeValue.ZERO_LENGTH;
             }
         } else if (object.containsKey(STRING_VALUE_FIELD)) {
             final JsonValue value = object.get(STRING_VALUE_FIELD);
@@ -259,4 +255,4 @@ public class IdPAttributePrincipalSerializer extends AbstractPrincipalSerializer
         return objectBuilderFactory.createArrayBuilder();
     }
     
-}
+}
\ No newline at end of file
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/LDAPPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/LDAPPrincipalSerializer.java
index 2bcf5ea..a81ea1d 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/LDAPPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/LDAPPrincipalSerializer.java
@@ -31,6 +31,7 @@ import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonReader;
@@ -77,81 +78,77 @@ public class LDAPPrincipalSerializer extends AbstractPrincipalSerializer<String>
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         return principal instanceof LdapPrincipal;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject()
-           .write(PRINCIPAL_NAME_FIELD, principal.getName());
-        final LdapEntry entry = ((LdapPrincipal) principal).getLdapEntry();
-        if (entry != null) {
-            final JsonObjectBuilder objectBuilder = getJsonObjectBuilder();
-            objectBuilder.add("dn", entry.getDn());
-            for (final LdapAttribute attr : entry.getAttributes()) {
-                final JsonArrayBuilder arrayBuilder = getJsonArrayBuilder();
-                for (final String value : attr.getStringValues()) {
-                    arrayBuilder.add(value);
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject()
+               .write(PRINCIPAL_NAME_FIELD, principal.getName());
+            final LdapEntry entry = ((LdapPrincipal) principal).getLdapEntry();
+            if (entry != null) {
+                final JsonObjectBuilder objectBuilder = getJsonObjectBuilder();
+                objectBuilder.add("dn", entry.getDn());
+                for (final LdapAttribute attr : entry.getAttributes()) {
+                    final JsonArrayBuilder arrayBuilder = getJsonArrayBuilder();
+                    for (final String value : attr.getStringValues()) {
+                        arrayBuilder.add(value);
+                    }
+                    objectBuilder.add(attr.getName(), arrayBuilder.build());
                 }
-                objectBuilder.add(attr.getName(), arrayBuilder.build());
+                gen.write(PRINCIPAL_ENTRY_FIELD, objectBuilder.build());
             }
-            gen.write(PRINCIPAL_ENTRY_FIELD, objectBuilder.build());
+            gen.writeEnd();
         }
-        gen.writeEnd();
-        gen.close();
         return sink.toString();
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public LdapPrincipal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing LdapPrincipal");
-        }
-        final JsonObject obj = (JsonObject) st;
-        final JsonString str = obj.getJsonString(PRINCIPAL_NAME_FIELD);
-        if (str != null) {
-            if (!Strings.isNullOrEmpty(str.getString())) {
-                LdapEntry entry = null;
-                final JsonObject jsonEntry = obj.getJsonObject(PRINCIPAL_ENTRY_FIELD);
-                if (jsonEntry != null) {
-                    entry = new LdapEntry();
-                    for (final Map.Entry<String, JsonValue> e : jsonEntry.entrySet()) {
-                        if ("dn".equalsIgnoreCase(e.getKey())) {
-                            entry.setDn(((JsonString) e.getValue()).getString());
-                        } else {
-                            final LdapAttribute attr = new LdapAttribute(e.getKey());
-                            for (final JsonValue v : (JsonArray) e.getValue()) {
-                                attr.addStringValue(((JsonString) v).getString());
+        
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing LdapPrincipal");
+            }
+            
+            final JsonObject obj = (JsonObject) st;
+            final JsonString str = obj.getJsonString(PRINCIPAL_NAME_FIELD);
+            if (str != null) {
+                if (!Strings.isNullOrEmpty(str.getString())) {
+                    LdapEntry entry = null;
+                    final JsonObject jsonEntry = obj.getJsonObject(PRINCIPAL_ENTRY_FIELD);
+                    if (jsonEntry != null) {
+                        entry = new LdapEntry();
+                        for (final Map.Entry<String, JsonValue> e : jsonEntry.entrySet()) {
+                            if ("dn".equalsIgnoreCase(e.getKey())) {
+                                entry.setDn(((JsonString) e.getValue()).getString());
+                            } else {
+                                final LdapAttribute attr = new LdapAttribute(e.getKey());
+                                for (final JsonValue v : (JsonArray) e.getValue()) {
+                                    attr.addStringValue(((JsonString) v).getString());
+                                }
+                                entry.addAttribute(attr);
                             }
-                            entry.addAttribute(attr);
                         }
                     }
+                    return new LdapPrincipal(str.getString(), entry);
                 }
-                return new LdapPrincipal(str.getString(), entry);
-            } else {
                 log.warn("Skipping null/empty LdapPrincipal");
             }
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing LdapPrincipal", e);
         }
-        return null;
     }
 
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/PasswordPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/PasswordPrincipalSerializer.java
index fd5eb08..7299bd5 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/PasswordPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/PasswordPrincipalSerializer.java
@@ -31,6 +31,7 @@ import javax.annotation.concurrent.ThreadSafe;
 import javax.json.Json;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonReader;
@@ -88,7 +89,6 @@ public class PasswordPrincipalSerializer extends AbstractPrincipalSerializer<Str
     }
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         if (principal instanceof PasswordPrincipal) {
             if (sealer == null) {
@@ -96,13 +96,11 @@ public class PasswordPrincipalSerializer extends AbstractPrincipalSerializer<Str
                 return false;
             }
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         
         if (sealer == null) {
@@ -110,8 +108,7 @@ public class PasswordPrincipalSerializer extends AbstractPrincipalSerializer<Str
         }
         
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        try {
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
             gen.writeStartObject()
                .write(PASSWORD_FIELD, sealer.wrap(principal.getName(),
                        Instant.now().plus(Duration.ofDays(365))))
@@ -119,12 +116,10 @@ public class PasswordPrincipalSerializer extends AbstractPrincipalSerializer<Str
         } catch (final DataSealerException e) {
             throw new IOException(e);
         }
-        gen.close();
         return sink.toString();
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         if (JSON_PATTERN.matcher(value).matches()) {
             if (sealer == null) {
@@ -132,43 +127,40 @@ public class PasswordPrincipalSerializer extends AbstractPrincipalSerializer<Str
                 return false;
             }
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public PasswordPrincipal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
         
         if (sealer == null) {
             throw new IOException("No DataSealer was provided, unable to support PasswordPrincipal deserialization");
         }
 
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing PasswordPrincipal");
-        }
-        final JsonObject obj = (JsonObject) st;
-        final JsonString str = obj.getJsonString(PASSWORD_FIELD);
-        if (str != null) {
-            if (!Strings.isNullOrEmpty(str.getString())) {
-                try {
-                    return new PasswordPrincipal(sealer.unwrap(str.getString()));
-                } catch (final DataSealerException e) {
-                    throw new IOException(e);
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing PasswordPrincipal");
+            }
+            
+            final JsonObject obj = (JsonObject) st;
+            final JsonString str = obj.getJsonString(PASSWORD_FIELD);
+            if (str != null) {
+                if (!Strings.isNullOrEmpty(str.getString())) {
+                    try {
+                        return new PasswordPrincipal(sealer.unwrap(str.getString()));
+                    } catch (final DataSealerException e) {
+                        throw new IOException(e);
+                    }
                 }
-            } else {
                 log.warn("Skipping null/empty PasswordPrincipal");
             }
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing PasswordPincipal", e);
         }
-        return null;
     }
 
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ProxyAuthenticationPrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ProxyAuthenticationPrincipalSerializer.java
index 7b18a5d..3bdb795 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ProxyAuthenticationPrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ProxyAuthenticationPrincipalSerializer.java
@@ -30,6 +30,7 @@ import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonReader;
@@ -79,52 +80,50 @@ public class ProxyAuthenticationPrincipalSerializer extends AbstractPrincipalSer
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
+        
         final JsonArrayBuilder arrayBuilder = getJsonArrayBuilder();
         for (final String aa : Collections2.filter(((ProxyAuthenticationPrincipal) principal).getAuthorities(),
                 Predicates.notNull())) {
             arrayBuilder.add(aa);
         }
+
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject().write(PROXY_AUTH_FIELD, arrayBuilder.build()).writeEnd();
-        gen.close();
+        
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject().write(PROXY_AUTH_FIELD, arrayBuilder.build()).writeEnd();
+        }
         return sink.toString();
     }
     
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public ProxyAuthenticationPrincipal deserialize(@Nonnull @NotEmpty final String value)
             throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing ProxyAuthenticationPrincipal");
-        }
         
-        final JsonValue jsonValue = ((JsonObject) st).get(PROXY_AUTH_FIELD);
-        if (jsonValue != null && ValueType.ARRAY.equals(jsonValue.getValueType())) {
-            final ProxyAuthenticationPrincipal ret = new ProxyAuthenticationPrincipal();
-            for (final JsonValue e : (JsonArray) jsonValue) {
-                if (ValueType.STRING.equals(e.getValueType())) {
-                    ret.getAuthorities().add(((JsonString) e).getString());
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing ProxyAuthenticationPrincipal");
+            }
+            
+            final JsonValue jsonValue = ((JsonObject) st).get(PROXY_AUTH_FIELD);
+            if (jsonValue != null && ValueType.ARRAY.equals(jsonValue.getValueType())) {
+                final ProxyAuthenticationPrincipal ret = new ProxyAuthenticationPrincipal();
+                for (final JsonValue e : (JsonArray) jsonValue) {
+                    if (ValueType.STRING.equals(e.getValueType())) {
+                        ret.getAuthorities().add(((JsonString) e).getString());
+                    }
                 }
+                return ret;
             }
-            return ret;
-        } else {
             throw new IOException("Serialized ProxyAuthenticationPrincipal missing array field");
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing ProxyAuthenticationPrincipal", e);
         }
     }
 
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/UsernamePrincipalSerializer.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/UsernamePrincipalSerializer.java
index 33f2995..7b7993a 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/UsernamePrincipalSerializer.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/UsernamePrincipalSerializer.java
@@ -26,6 +26,7 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonReader;
 import javax.json.JsonString;
@@ -57,50 +58,47 @@ public class UsernamePrincipalSerializer extends AbstractPrincipalSerializer<Str
     @Nonnull private final Logger log = LoggerFactory.getLogger(UsernamePrincipalSerializer.class);
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull final Principal principal) {
         return principal instanceof UsernamePrincipal;
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nonnull @NotEmpty public String serialize(@Nonnull final Principal principal) throws IOException {
         final StringWriter sink = new StringWriter(32);
-        final JsonGenerator gen = getJsonGenerator(sink);
-        gen.writeStartObject()
-            .write(USERNAME_FIELD, principal.getName())
-            .writeEnd();
-        gen.close();
+        try (final JsonGenerator gen = getJsonGenerator(sink)) {
+            gen.writeStartObject()
+                .write(USERNAME_FIELD, principal.getName())
+                .writeEnd();
+        }
         return sink.toString();
     }
 
     /** {@inheritDoc} */
-    @Override
     public boolean supports(@Nonnull @NotEmpty final String value) {
         return JSON_PATTERN.matcher(value).matches();
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public UsernamePrincipal deserialize(@Nonnull @NotEmpty final String value) throws IOException {
-        final JsonReader reader = getJsonReader(new StringReader(value));
-        JsonStructure st = null;
-        try {
-            st = reader.read();
-        } finally {
-            reader.close();
-        }
-        if (!(st instanceof JsonObject)) {
-            throw new IOException("Found invalid data structure while parsing UsernamePrincipal");
-        }
-        final JsonString str = ((JsonObject) st).getJsonString(USERNAME_FIELD);
-        if (str != null) {
-            final String username = str.getString();
-            if (!Strings.isNullOrEmpty(username)) {
-                return new UsernamePrincipal(username);
+        
+        try (final JsonReader reader = getJsonReader(new StringReader(value))) {
+            
+            final JsonStructure st = reader.read();
+            if (!(st instanceof JsonObject)) {
+                throw new IOException("Found invalid data structure while parsing UsernamePrincipal");
+            }
+            
+            final JsonString str = ((JsonObject) st).getJsonString(USERNAME_FIELD);
+            if (str != null) {
+                final String username = str.getString();
+                if (!Strings.isNullOrEmpty(username)) {
+                    return new UsernamePrincipal(username);
+                }
             }
+            return null;
+        } catch (final JsonException e) {
+            throw new IOException("Found invalid data structure while parsing UsernamePrincipal", e);
         }
-        return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSAcceptorLoginModule.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSAcceptorLoginModule.java
index 1622cb6..6a57545 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSAcceptorLoginModule.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSAcceptorLoginModule.java
@@ -52,10 +52,10 @@ public class GSSAcceptorLoginModule {
     @Nullable private LoginModule krbModule;
 
     /** Hashtable to hold state of the JAAS login module. */
-    @Nonnull private Map<String, String> state = new HashMap<String, String>();
+    @Nonnull private Map<String, String> state = new HashMap<>();
 
     /** Options for the JAAS login module. */
-    @Nonnull private Map<String, String> options = new HashMap<String, String>();
+    @Nonnull private Map<String, String> options = new HashMap<>();
 
     /** The realm settings. */
     @Nonnull private KerberosRealmSettings realm;
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSContextAcceptor.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSContextAcceptor.java
index 7737fda..2d5a647 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSContextAcceptor.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/spnego/impl/GSSContextAcceptor.java
@@ -247,7 +247,7 @@ public class GSSContextAcceptor {
      */
     @Nonnull private GSSCredential getServerCredential(@Nonnull final Subject subject)
             throws PrivilegedActionException {
-        final PrivilegedExceptionAction<GSSCredential> action = new PrivilegedExceptionAction<GSSCredential>() {
+        final PrivilegedExceptionAction<GSSCredential> action = new PrivilegedExceptionAction<>() {
             public GSSCredential run() throws GSSException {
                 final GSSManager manager = GSSManager.getInstance();
                 final GSSCredential newServerCreds =
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
index 91d3135..4d058a7 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
@@ -37,7 +37,6 @@ import net.shibboleth.idp.authn.principal.impl.ExactPrincipalEvalPredicateFactor
 import net.shibboleth.idp.profile.ActionTestingSupport;
 
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.mock.web.MockHttpServletRequest;
@@ -121,7 +120,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -140,7 +139,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
         
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -157,7 +156,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.UNKNOWN_USERNAME);
@@ -178,7 +177,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, "InvalidPassword");
@@ -199,7 +198,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -222,7 +221,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -244,7 +243,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -266,7 +265,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -289,7 +288,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -318,7 +317,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -331,7 +330,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
                 .next().getName(), "test1");
     }
     
-    private void doExtract(ProfileRequestContext prc) throws Exception {
+    private void doExtract() throws Exception {
         final ExtractUsernamePasswordFromFormRequest extract = new ExtractUsernamePasswordFromFormRequest();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
index bcf7669..fd65226 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
@@ -43,7 +43,6 @@ import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.net.URISupport;
 
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
@@ -147,7 +146,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         validator.initialize();
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
@@ -170,7 +169,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
@@ -201,7 +200,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -220,7 +219,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
         
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -239,7 +238,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         validator.initialize();
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, "UnknownUsername");
@@ -262,7 +261,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, "InvalidPassword");
@@ -286,7 +285,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -312,7 +311,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -345,7 +344,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -373,7 +372,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -399,7 +398,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -410,7 +409,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
                 .next().getName(), "PETER_THE_PRINCIPAL");
     }
     
-    private void doExtract(ProfileRequestContext prc) throws Exception {
+    private void doExtract() throws Exception {
         final ExtractUsernamePasswordFromFormRequest extract = new ExtractUsernamePasswordFromFormRequest();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
index adf8ada..1477529 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
@@ -49,7 +49,6 @@ import org.ldaptive.auth.ext.PasswordPolicyAccountState;
 import org.ldaptive.control.PasswordPolicyControl;
 import org.ldaptive.jaas.LdapPrincipal;
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
@@ -186,7 +185,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -204,7 +203,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -233,7 +232,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
 
@@ -263,7 +262,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -291,7 +290,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -311,7 +310,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -345,7 +344,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -381,7 +380,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         AuthenticationResult result = ac.getAuthenticationResult();
@@ -427,7 +426,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
 
@@ -469,7 +468,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -512,7 +511,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -555,7 +554,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -594,7 +593,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -633,7 +632,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -641,7 +640,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         Assert.assertNotNull(ac.getSubcontext(UsernamePasswordContext.class));
     }
 
-    private void doExtract(ProfileRequestContext prc) throws Exception {
+    private void doExtract() throws Exception {
         final ExtractUsernamePasswordFromFormRequest extract = new ExtractUsernamePasswordFromFormRequest();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
index ef6b032..99e4e70 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
@@ -40,7 +40,6 @@ import org.ldaptive.auth.AuthenticationResultCode;
 import org.ldaptive.auth.Authenticator;
 import org.ldaptive.auth.BindAuthenticationHandler;
 import org.ldaptive.jaas.LdapPrincipal;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
@@ -142,7 +141,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -167,7 +166,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -184,7 +183,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -209,7 +208,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -244,7 +243,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -279,7 +278,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         action.setRequireAll(true);
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         Assert.assertNull(ac.getAuthenticationResult());
@@ -305,7 +304,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         action.setRequireAll(true);
         action.initialize();
 
-        doExtract(prc);
+        doExtract();
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -332,7 +331,7 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         Assert.assertNotNull(lp.getLdapEntry());
     }
 
-    private void doExtract(ProfileRequestContext prc) throws Exception {
+    private void doExtract() throws Exception {
         final ExtractUsernamePasswordFromFormRequest extract = new ExtractUsernamePasswordFromFormRequest();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateRemoteUserTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateRemoteUserTest.java
index 584802b..e185d72 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateRemoteUserTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateRemoteUserTest.java
@@ -30,7 +30,6 @@ import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
@@ -68,7 +67,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.NO_CREDENTIALS);
@@ -80,7 +79,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
@@ -92,7 +91,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -107,7 +106,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
@@ -119,7 +118,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -128,7 +127,7 @@ public class ValidateRemoteUserTest extends BaseAuthenticationContextTest {
                 UsernamePrincipal.class).iterator().next().getName(), "ban");
     }
     
-    private void doExtract(ProfileRequestContext prc) throws ComponentInitializationException {
+    private void doExtract() throws ComponentInitializationException {
         final ExtractRemoteUser extract = new ExtractRemoteUser();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
index cd48b30..f363b17 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
@@ -34,7 +34,6 @@ import net.shibboleth.utilities.java.support.component.ComponentInitializationEx
 import net.shibboleth.utilities.java.support.net.IPRange;
 
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
@@ -74,7 +73,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.NO_CREDENTIALS);
@@ -84,7 +83,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class, false);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
@@ -103,7 +102,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         rpc.setRequestedPrincipals(Arrays.<Principal>asList(new TestPrincipal("PasswordAuthentication")));
         ac.addSubcontext(rpc, true);
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -122,7 +121,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         rpc.setRequestedPrincipals(Arrays.<Principal>asList(new TestPrincipal("UserAgentAuthentication")));
         ac.addSubcontext(rpc, true);
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -131,7 +130,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
                 UsernamePrincipal.class).iterator().next().getName(), "foo");
     }
     
-    private void doExtract(ProfileRequestContext prc) throws ComponentInitializationException {
+    private void doExtract() throws ComponentInitializationException {
         final ExtractUserAgentAddress extract = new ExtractUserAgentAddress();
         extract.setHttpServletRequest(action.getHttpServletRequest());
         extract.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateX509CertificateTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateX509CertificateTest.java
index 87d23b0..73f94f0 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateX509CertificateTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateX509CertificateTest.java
@@ -30,7 +30,6 @@ import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.security.credential.CredentialResolver;
 import org.opensaml.security.credential.impl.StaticCredentialResolver;
 import org.opensaml.security.trust.TrustEngine;
@@ -122,7 +121,7 @@ public class ValidateX509CertificateTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -150,7 +149,7 @@ public class ValidateX509CertificateTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -180,14 +179,14 @@ public class ValidateX509CertificateTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        doExtract(prc);
+        doExtract();
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_CREDENTIALS);
         Assert.assertNull(ac.getAuthenticationResult());
     }
     
-    private void doExtract(ProfileRequestContext prc) throws ComponentInitializationException, CertificateException {
+    private void doExtract() throws ComponentInitializationException, CertificateException {
         final ExtractX509CertificateFromRequest extract = new ExtractX509CertificateFromRequest();
         extract.setHttpServletRequest(action.getHttpServletRequest());
 
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/KerberosSettingsTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/KerberosSettingsTest.java
index 6b83a4c..059f550 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/KerberosSettingsTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/KerberosSettingsTest.java
@@ -46,7 +46,7 @@ public class KerberosSettingsTest {
         realm1.setKeytab(KEYTAB);
         realm1.initialize();
 
-        realms = new ArrayList<KerberosRealmSettings>();
+        realms = new ArrayList<>();
         realms.add(realm1);
     }
 
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
index 01c13f2..d77e8df 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
@@ -235,7 +235,7 @@ public class SPNEGOAuthnControllerTest {
                 failedGSSController.continueSPNEGO(TEST_CONVERSATION_KEY, "Negotiate " + NEGOTIATE_HEADER_DATA, req,
                         null);
 
-        Assert.assertSame((GSSException) ((ExternalAuthenticationException) req
+        Assert.assertSame(((ExternalAuthenticationException) req
                 .getAttribute(ExternalAuthentication.AUTHENTICATION_EXCEPTION_KEY)).getCause(), expected);
         assertAuthenticationExceptionCause(req, mv, GSSException.class);
     }
@@ -282,7 +282,7 @@ public class SPNEGOAuthnControllerTest {
                 mockedGSSController.continueSPNEGO(TEST_CONVERSATION_KEY, "Negotiate " + NEGOTIATE_HEADER_DATA, req,
                         null);
 
-        Assert.assertSame((RuntimeException) ((ExternalAuthenticationException) req
+        Assert.assertSame(((ExternalAuthenticationException) req
                 .getAttribute(ExternalAuthentication.AUTHENTICATION_EXCEPTION_KEY)).getCause(), e);
         assertAuthenticationExceptionCause(req, mv, RuntimeException.class);
     }
@@ -354,7 +354,7 @@ public class SPNEGOAuthnControllerTest {
         ModelAndView mv =
                 mockedGSSController.continueSPNEGO(TEST_CONVERSATION_KEY, "Negotiate " + NEGOTIATE_HEADER_DATA, req,
                         null);
-        Assert.assertSame((GSSException) ((ExternalAuthenticationException) req
+        Assert.assertSame(((ExternalAuthenticationException) req
                 .getAttribute(ExternalAuthentication.AUTHENTICATION_EXCEPTION_KEY)).getCause(), gssException);
         assertAuthenticationExceptionCause(req, mv, GSSException.class);
     }
@@ -430,7 +430,7 @@ public class SPNEGOAuthnControllerTest {
         AuthenticationContext ac = new AuthenticationContext();
         SPNEGOContext sc = new SPNEGOContext();
         KerberosSettings ks = new KerberosSettings();
-        List<KerberosRealmSettings> realms = new ArrayList<KerberosRealmSettings>();
+        List<KerberosRealmSettings> realms = new ArrayList<>();
         realms.add(new KerberosRealmSettings());
         ks.setRealms(realms);
         sc.setKerberosSettings(ks);
@@ -455,7 +455,7 @@ public class SPNEGOAuthnControllerTest {
     }
 
     private void assertAuthenticationExceptionCause(MockHttpServletRequest request, ModelAndView mv,
-            Class exceptedExceptionClass) {
+            Class<?> exceptedExceptionClass) {
         Assert.assertNull(mv);
         Assert.assertEquals(((ExternalAuthenticationException) request
                 .getAttribute(ExternalAuthentication.AUTHENTICATION_EXCEPTION_KEY)).getCause().getClass(),
@@ -492,8 +492,8 @@ public class SPNEGOAuthnControllerTest {
 
         private ProfileRequestContext profileRequestContext;
 
-        public void setProfileRequestContext(ProfileRequestContext profileRequestContext) {
-            this.profileRequestContext = profileRequestContext;
+        public void setProfileRequestContext(ProfileRequestContext prc) {
+            profileRequestContext = prc;
         }
 
         @Override
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOContextTest.java
index 4b2b8ec..d82fbff 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOContextTest.java
@@ -31,7 +31,7 @@ public class SPNEGOContextTest {
         KerberosSettings settings = new KerberosSettings();
         KerberosRealmSettings realm1 = new KerberosRealmSettings();
         KerberosRealmSettings realm2 = new KerberosRealmSettings();
-        ArrayList<KerberosRealmSettings> realms = new ArrayList<KerberosRealmSettings>();
+        ArrayList<KerberosRealmSettings> realms = new ArrayList<>();
         realms.add(realm1);
         realms.add(realm2);
         settings.setRealms(realms);
diff --git a/idp-bom/.settings/org.eclipse.jdt.core.prefs b/idp-bom/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-bom/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-bom/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-cas-api/.settings/org.eclipse.jdt.core.prefs b/idp-cas-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-cas-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-cas-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
index 071bc67..1ac693d 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
@@ -63,9 +63,8 @@ public abstract class AbstractCASAttributeTranscoder<EncodedType extends IdPAttr
                 rule.get(AttributeTranscoderRegistry.PROP_ID, String.class));
         if (name != null) {
             return new NamingFunction().apply(new Attribute(name));
-        } else {
-            return null;
         }
+        return null;
     }
     
     /** {@inheritDoc} */
@@ -196,7 +195,7 @@ public abstract class AbstractCASAttributeTranscoder<EncodedType extends IdPAttr
             throw new AttributeDecodingException("Required transcoder property 'id' not found");
         }
         
-        if (!((Attribute) attribute).getValues().isEmpty() && attributeValues.isEmpty()) {
+        if (!attribute.getValues().isEmpty() && attributeValues.isEmpty()) {
             throw new AttributeDecodingException("Failed to decode any values for attribute " + attribute.getName());
         }
         
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ProtocolError.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ProtocolError.java
index b33456d..fa3a1a5 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ProtocolError.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ProtocolError.java
@@ -133,7 +133,7 @@ public enum ProtocolError {
      * @return Spring webflow event.
      */
     @Nonnull public Event event(@Nonnull final Object source) {
-        final LocalAttributeMap attributes = new LocalAttributeMap();
+        final LocalAttributeMap<Object> attributes = new LocalAttributeMap<>();
         attributes.put("code", errorCode);
         attributes.put("detailCode", errorDetailCode);
         return new Event(source, name(), attributes);
diff --git a/idp-cas-impl/.settings/org.eclipse.jdt.core.prefs b/idp-cas-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-cas-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-cas-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-conf/.settings/org.eclipse.jdt.core.prefs b/idp-conf/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-conf/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-conf/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
index cf648a7..f37bdc3 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/AbstractFlowTest.java
@@ -217,7 +217,7 @@ public abstract class AbstractFlowTest extends AbstractTestNGSpringContextTests
      * {@link HttpServletRequestResponseContext#loadCurrent(HttpServletRequest, HttpServletResponse)}
      */
     @BeforeMethod public void initializeThreadLocals() {
-        HttpServletRequestResponseContext.loadCurrent((HttpServletRequest) request, (HttpServletResponse) response);
+        HttpServletRequestResponseContext.loadCurrent(request, response);
     }
 
     /**
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
index 3ebe8a1..739f0ce 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
@@ -52,8 +52,8 @@ public class SetupForSAML1C14N extends AbstractProfileAction {
 
     private TransientSAML1NameIdentifierGenerator generator;
     
-    public void setAttributeName(@Nullable final String attributeName) {
-        this.attributeName = attributeName;
+    public void setAttributeName(@Nullable final String name) {
+        attributeName = name;
     }
 
     public void setGenerator(@Nullable final TransientSAML1NameIdentifierGenerator gen) {
@@ -66,8 +66,9 @@ public class SetupForSAML1C14N extends AbstractProfileAction {
             return null;
         }
 
-        final SAMLObjectBuilder<NameIdentifier> identifierBuilder =  (SAMLObjectBuilder<NameIdentifier>) XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(
-                NameIdentifier.DEFAULT_ELEMENT_NAME);
+        final SAMLObjectBuilder<NameIdentifier> identifierBuilder = (SAMLObjectBuilder<NameIdentifier>)
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<NameIdentifier>getBuilderOrThrow(
+                        NameIdentifier.DEFAULT_ELEMENT_NAME);
 
         final NameIdentifier nameId = identifierBuilder.buildObject();
         nameId.setFormat(NameIdentifier.UNSPECIFIED);
@@ -78,14 +79,13 @@ public class SetupForSAML1C14N extends AbstractProfileAction {
             if (attrValue instanceof StringAttributeValue) {
                 final String value = ((StringAttributeValue)attrValue).getValue();
                 // Check for empty or all-whitespace, but don't trim.
-                if (StringSupport.trimOrNull((String) value) == null) {
+                if (StringSupport.trimOrNull(value) == null) {
                     continue;
                 }
-                nameId.setValue((String) value);
+                nameId.setValue(value);
                 return nameId;
-            } else {
-                continue;
             }
+            continue;
         }
         return null;
     }
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
index d55101f..5b16b88 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
@@ -56,8 +56,8 @@ public class SetupForSAML2C14N extends AbstractProfileAction {
         generator = gen;
     }
 
-    public void setAttributeName(@Nullable final String attributeName) {
-        this.attributeName = attributeName;
+    public void setAttributeName(@Nullable final String name) {
+        attributeName = name;
     }
 
     private NameID encode(@Nonnull final IdPAttribute attribute) {
@@ -67,7 +67,8 @@ public class SetupForSAML2C14N extends AbstractProfileAction {
             return null;
         }
         final SAMLObjectBuilder<NameID> identifierBuilder = (SAMLObjectBuilder<NameID>)
-                XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(NameID.DEFAULT_ELEMENT_NAME);
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<NameID>getBuilderOrThrow(
+                        NameID.DEFAULT_ELEMENT_NAME);
         final NameID nameId = identifierBuilder.buildObject();
         nameId.setFormat(NameIDType.UNSPECIFIED);
         for (final IdPAttributeValue attrValue : attributeValues) {
@@ -77,14 +78,13 @@ public class SetupForSAML2C14N extends AbstractProfileAction {
             if (attrValue instanceof StringAttributeValue) {
                 final String value = ((StringAttributeValue)attrValue).getValue();
                 // Check for empty or all-whitespace, but don't trim.
-                if (StringSupport.trimOrNull((String) value) == null) {
+                if (StringSupport.trimOrNull(value) == null) {
                     continue;
                 }
-                nameId.setValue((String) value);
+                nameId.setValue(value);
                 return nameId;
-            } else {
-                continue;
             }
+            continue;
         }
         return null;
     }
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
index 1ad6d64..2f12e4e 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/interceptor/InterceptFlowTest.java
@@ -60,10 +60,12 @@ public class InterceptFlowTest extends AbstractFlowTest {
     @BeforeMethod public void setUserConfiguredInterceptFlows() {
         final Flow flow = getFlow(TEST_PROFILE_FLOW_ID);
 
-        final List activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
+        final List<ProfileInterceptorFlowDescriptor> activatedFlows =
+                flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
         activatedFlows.clear();
 
-        final List interceptFlows = flow.getApplicationContext().getBean(INTERCEPT_FLOWS_BEAN_ID, List.class);
+        final List<ProfileInterceptorFlowDescriptor> interceptFlows =
+                flow.getApplicationContext().getBean(INTERCEPT_FLOWS_BEAN_ID, List.class);
         interceptFlows.clear();
 
         final ProfileInterceptorFlowDescriptor flowDescriptor1 = new ProfileInterceptorFlowDescriptor();
@@ -108,7 +110,7 @@ public class InterceptFlowTest extends AbstractFlowTest {
     @Test public void testOneAvailableFlow() {
 
         final Flow flow = getFlow(TEST_PROFILE_FLOW_ID);
-        final List activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
+        final List<String> activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
         activatedFlows.add("test-proceed-1-flow");
 
         final FlowExecutionResult result = flowExecutor.launchExecution(TEST_PROFILE_FLOW_ID, null, externalContext);
@@ -128,7 +130,7 @@ public class InterceptFlowTest extends AbstractFlowTest {
     @Test public void testTwoAvailableFlows() {
 
         final Flow flow = getFlow(TEST_PROFILE_FLOW_ID);
-        final List activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
+        final List<String> activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
         activatedFlows.add("test-proceed-1-flow");
         activatedFlows.add("test-proceed-2-flow");
         
@@ -149,7 +151,7 @@ public class InterceptFlowTest extends AbstractFlowTest {
     @Test public void testErrorFlow() {
 
         final Flow flow = getFlow(TEST_PROFILE_FLOW_ID);
-        final List activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
+        final List<String> activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
         activatedFlows.add("test-error-flow");
 
         final FlowExecutionResult result = flowExecutor.launchExecution(TEST_PROFILE_FLOW_ID, null, externalContext);
@@ -169,7 +171,7 @@ public class InterceptFlowTest extends AbstractFlowTest {
     @Test public void testProceedThenErrorFlow() {
 
         final Flow flow = getFlow(TEST_PROFILE_FLOW_ID);
-        final List activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
+        final List<String> activatedFlows = flow.getApplicationContext().getBean(ACTIVATED_FLOWS_BEAN_ID, List.class);
         activatedFlows.add("test-proceed-1-flow");
         activatedFlows.add("test-error-flow");
 
diff --git a/idp-consent-api/.settings/org.eclipse.jdt.core.prefs b/idp-consent-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-consent-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-consent-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-consent-impl/.settings/org.eclipse.jdt.core.prefs b/idp-consent-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-consent-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-consent-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractor.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractor.java
index 949f309..829b57e 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractor.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractor.java
@@ -58,9 +58,8 @@ public class CurrentConsentIdsAuditExtractor implements Function<ProfileRequestC
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null) {
             return consentContext.getCurrentConsents().keySet();
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java
index d565895..5b5953e 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java
@@ -63,9 +63,8 @@ public class CurrentConsentIsApprovedAuditExtractor implements Function<ProfileR
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null && !consentContext.getCurrentConsents().isEmpty()) {
             return Collections2.transform(consentContext.getCurrentConsents().values(), Consent::isApproved);
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractor.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractor.java
index fd7eab9..a275acd 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractor.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractor.java
@@ -62,9 +62,8 @@ public class CurrentConsentValuesAuditExtractor implements Function<ProfileReque
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null && !consentContext.getCurrentConsents().isEmpty()) {
             return Collections2.transform(consentContext.getCurrentConsents().values(), Consent::getValue);
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
index b65c2e7..05f1fd6 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
@@ -172,7 +172,8 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
      */
     @Nonnull @NonnullElements protected List<String> getStorageKeysFromIndex() throws IOException {
 
-        final StorageRecord storageRecord = getStorageService().read(getStorageContext(), getStorageIndexKey());
+        final StorageRecord<Collection<String>> storageRecord =
+            getStorageService().read(getStorageContext(), getStorageIndexKey());
 
         log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
                 getStorageContext(), getStorageIndexKey());
@@ -181,8 +182,8 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
             return Collections.emptyList();
         }
 
-        return new ArrayList<>((Collection<String>) storageRecord.getValue(getStorageKeysSerializer(),
-                getStorageContext(), getStorageIndexKey()));
+        return new ArrayList<>(storageRecord.getValue(getStorageKeysSerializer(), getStorageContext(),
+                getStorageIndexKey()));
     }
 
     /**
@@ -194,7 +195,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
      */
     protected boolean addKeyToStorageIndex(@Nonnull final String keyToAdd) throws IOException {
 
-        final StorageRecord storageRecord = getStorageService().read(getStorageContext(), getStorageIndexKey());
+        final StorageRecord<?> storageRecord = getStorageService().read(getStorageContext(), getStorageIndexKey());
         log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
                 getStorageContext(), getStorageIndexKey());
 
@@ -202,17 +203,17 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
             log.debug("{} Creating storage index with key '{}'", getLogPrefix(), keyToAdd);
             return getStorageService().create(getStorageContext(), getStorageIndexKey(),
                     Collections.singletonList(keyToAdd), storageKeysSerializer, null);
-        } else {
-            final LinkedHashSet<String> keys = new LinkedHashSet<>(getStorageKeysFromIndex());
-            if (keys.add(keyToAdd)) {
-                log.debug("{} Updating storage index by adding key '{}'", getLogPrefix(), keyToAdd);
-                return getStorageService().update(getStorageContext(), getStorageIndexKey(), keys,
-                        storageKeysSerializer, null);
-            } else {
-                log.debug("{} Storage key '{}' already indexed, nothing to do", getLogPrefix(), keyToAdd);
-                return false;
-            }
         }
+        
+        final LinkedHashSet<String> keys = new LinkedHashSet<>(getStorageKeysFromIndex());
+        if (keys.add(keyToAdd)) {
+            log.debug("{} Updating storage index by adding key '{}'", getLogPrefix(), keyToAdd);
+            return getStorageService().update(getStorageContext(), getStorageIndexKey(), keys,
+                    storageKeysSerializer, null);
+        }
+        
+        log.debug("{} Storage key '{}' already indexed, nothing to do", getLogPrefix(), keyToAdd);
+        return false;
     }
 
     /**
@@ -224,7 +225,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
      */
     protected boolean removeKeyFromStorageIndex(@Nonnull final String keyToRemove) throws IOException {
 
-        final StorageRecord storageRecord = getStorageService().read(getStorageContext(), getStorageIndexKey());
+        final StorageRecord<?> storageRecord = getStorageService().read(getStorageContext(), getStorageIndexKey());
         log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
                 getStorageContext(), getStorageIndexKey());
 
@@ -232,17 +233,17 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
             log.debug("{} No storage record exists with context '{}' and key '{}', nothing to do", getLogPrefix(),
                     getStorageContext(), getStorageIndexKey());
             return false;
-        } else {
-            final LinkedHashSet<String> keys = new LinkedHashSet<>(getStorageKeysFromIndex());
-            if (keys.remove(keyToRemove)) {
-                log.debug("{} Updating storage index by removing key '{}'", getLogPrefix(), keyToRemove);
-                return getStorageService().update(getStorageContext(), storageIndexKey, keys, storageKeysSerializer,
-                        null);
-            } else {
-                log.debug("{} Storage key '{}' not indexed, nothing to do", getLogPrefix(), keyToRemove);
-                return false;
-            }
         }
+        
+        final LinkedHashSet<String> keys = new LinkedHashSet<>(getStorageKeysFromIndex());
+        if (keys.remove(keyToRemove)) {
+            log.debug("{} Updating storage index by removing key '{}'", getLogPrefix(), keyToRemove);
+            return getStorageService().update(getStorageContext(), storageIndexKey, keys, storageKeysSerializer,
+                    null);
+        }
+        
+        log.debug("{} Storage key '{}' not indexed, nothing to do", getLogPrefix(), keyToRemove);
+        return false;
     }
 
 //CheckStyle: ReturnCount OFF
@@ -282,7 +283,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
         }
 
         if (storageKeysStrategy != null) {
-            final List<String> sortedKeys = storageKeysStrategy.apply(new Pair(profileRequestContext, keys));
+            final List<String> sortedKeys = storageKeysStrategy.apply(new Pair<>(profileRequestContext, keys));
             if (sortedKeys != null) {
                 keys = sortedKeys;
             }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageAction.java
index 5d5e9ca..8a15f0c 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageAction.java
@@ -17,11 +17,13 @@
 
 package net.shibboleth.idp.consent.flow.storage.impl;
 
+import java.util.Map;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.flow.impl.AbstractConsentAction;
 import net.shibboleth.idp.consent.logic.impl.FlowIdLookupFunction;
 import net.shibboleth.idp.consent.storage.impl.ConsentSerializer;
@@ -69,7 +71,7 @@ public abstract class AbstractConsentStorageAction extends AbstractConsentAction
     @NonnullAfterInit private Function<ProfileRequestContext,String> storageKeyLookupStrategy;
 
     /** Storage serializer. */
-    @NonnullAfterInit private StorageSerializer storageSerializer;
+    @NonnullAfterInit private StorageSerializer<Map<String,Consent>> storageSerializer;
 
     /** Storage service from the {@link ProfileInterceptorFlowDescriptor}. */
     @Nullable private StorageService storageService;
@@ -109,11 +111,22 @@ public abstract class AbstractConsentStorageAction extends AbstractConsentAction
      * 
      * @return the storage serializer
      */
-    @NonnullAfterInit public StorageSerializer getStorageSerializer() {
+    @NonnullAfterInit public StorageSerializer<Map<String,Consent>> getStorageSerializer() {
         return storageSerializer;
     }
 
     /**
+     * Set the storage serializer.
+     * 
+     * @param serializer storage serializer
+     */
+    public void setStorageSerializer(@Nonnull final StorageSerializer<Map<String,Consent>> serializer) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+
+        storageSerializer = Constraint.isNotNull(serializer, "Storage serializer cannot be null");
+    }
+    
+    /**
      * Set the storage context lookup strategy.
      * 
      * @param strategy the storage context lookup strategy
@@ -136,17 +149,6 @@ public abstract class AbstractConsentStorageAction extends AbstractConsentAction
     }
 
     /**
-     * Set the storage serializer.
-     * 
-     * @param serializer storage serializer
-     */
-    public void setStorageSerializer(@Nonnull final StorageSerializer serializer) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-
-        storageSerializer = Constraint.isNotNull(serializer, "Storage serializer cannot be null");
-    }
-
-    /**
      * Get the storage service from the {@link ProfileInterceptorFlowDescriptor}.
      * 
      * @return the storage service
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/ReadConsentFromStorage.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/ReadConsentFromStorage.java
index aa1725d..32afc64 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/ReadConsentFromStorage.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/ReadConsentFromStorage.java
@@ -49,7 +49,7 @@ public class ReadConsentFromStorage extends AbstractConsentStorageAction {
         final String key = getStorageKey();
 
         try {
-            final StorageRecord storageRecord = getStorageService().read(context, key);
+            final StorageRecord<Map<String,Consent>> storageRecord = getStorageService().read(context, key);
             log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
                     context, key);
 
@@ -58,8 +58,7 @@ public class ReadConsentFromStorage extends AbstractConsentStorageAction {
                 return;
             }
 
-            final Map<String, Consent> consents =
-                    (Map<String, Consent>) storageRecord.getValue(getStorageSerializer(), context, key);
+            final Map<String,Consent> consents = storageRecord.getValue(getStorageSerializer(), context, key);
 
             getConsentContext().getPreviousConsents().putAll(consents);
 
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
index f804d80..8a4a783 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounter.java
@@ -50,7 +50,7 @@ public class UpdateCounter extends AbstractConsentStorageAction {
             final String context = getStorageContext();
             final String key = getStorageKey();
 
-            final StorageRecord storageRecord = getStorageService().read(context, key);
+            final StorageRecord<?> storageRecord = getStorageService().read(context, key);
             log.debug("{} Read storage record '{}' with context '{}' and key '{}'", getLogPrefix(), storageRecord,
                     context, key);
 
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
index 91b59df..9e3683e 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
@@ -82,9 +82,8 @@ public abstract class AbstractAttributeDisplayFunction implements Function<IdPAt
         }
         if (locale == null) {
             return input.getId();
-        } else {
-            return displayInfo.get(locale);
         }
+        return displayInfo.get(locale);
     }
 
     /**
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributePredicate.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributePredicate.java
index 9962952..ab0bf6c 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributePredicate.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributePredicate.java
@@ -105,14 +105,13 @@ public class AttributePredicate extends AbstractInitializableComponent implement
             // Not in whitelist. Only accept if a regexp applies.
             if (matchExpression == null) {
                 return false;
-            } else {
-                return matchExpression.matcher(attributeId).matches();
             }
-        } else {
-            // In whitelist (or none). Check blacklist, and if necessary a regexp.
-            return !blacklistedAttributeIds.contains(attributeId)
-                    && (matchExpression == null || matchExpression.matcher(attributeId).matches());
+            return matchExpression.matcher(attributeId).matches();
         }
+        
+        // In whitelist (or none). Check blacklist, and if necessary a regexp.
+        return !blacklistedAttributeIds.contains(attributeId)
+                && (matchExpression == null || matchExpression.matcher(attributeId).matches());
     }
 
     /**
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunction.java
index 9e086d9..c8fcf06 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunction.java
@@ -72,9 +72,8 @@ public class AttributeValuesHashFunction implements Function<Collection<IdPAttri
             return null;
         }
 
-        try {
-            final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-            final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+        try (final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
 
             for (final IdPAttributeValue value : filteredInput) {
                 if (value instanceof ScopedStringAttributeValue) {
@@ -102,9 +101,6 @@ public class AttributeValuesHashFunction implements Function<Collection<IdPAttri
             }
 
             objectOutputStream.flush();
-            objectOutputStream.close();
-            byteArrayOutputStream.close();
-
             return CodecUtil.b64(HashUtil.sha256(byteArrayOutputStream.toByteArray()));
 
         } catch (final IOException e) {
@@ -113,4 +109,5 @@ public class AttributeValuesHashFunction implements Function<Collection<IdPAttri
         }
     }
     // CheckStyle: CyclomaticComplexity ON
-}
+    
+}
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunction.java
index 414589d..d8bb636 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunction.java
@@ -67,7 +67,7 @@ public class CounterStorageKeyFunction extends AbstractInitializableComponent im
 
     /** Constructor. */
     public CounterStorageKeyFunction() {
-        setInterceptorContextLookupStrategy(new ChildContextLookup(ProfileInterceptorContext.class));
+        setInterceptorContextLookupStrategy(new ChildContextLookup<>(ProfileInterceptorContext.class));
         setStorageContextLookupStrategy(new FlowIdLookupFunction());
     }
 
@@ -167,7 +167,7 @@ public class CounterStorageKeyFunction extends AbstractInitializableComponent im
 
         final String counterStorageKey = getCounterStorageKey(storageKey);
 
-        final StorageRecord storageRecord = storageService.read(storageContext, counterStorageKey);
+        final StorageRecord<?> storageRecord = storageService.read(storageContext, counterStorageKey);
         log.debug("Read storage record '{}' with context '{}' and key '{}'", storageRecord, storageContext,
                 counterStorageKey);
 
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunction.java
index e62c0c3..8046c45 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunction.java
@@ -85,7 +85,7 @@ public class FlowDescriptorLookupFunction<T extends ProfileInterceptorFlowDescri
             return null;
         }
 
-        return (T) interceptorFlowDescriptor;
+        return interceptorFlowDescriptorType.cast(interceptorFlowDescriptor);
     }
 
 }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsAttributeRequiredPredicate.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsAttributeRequiredPredicate.java
index e6ae36c..ccc41e9 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsAttributeRequiredPredicate.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsAttributeRequiredPredicate.java
@@ -58,7 +58,7 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
     @Nonnull private Function<SAMLMetadataContext,AttributeConsumingService> acsLookupStrategy;
 
     /** Map of requested attributes. */
-    @Nullable private final Multimap<String,IdPRequestedAttribute> requestedAttributesMap;
+    @Nullable private final Multimap<String,IdPAttribute> requestedAttributesMap;
 
     /**
      * Constructor.
@@ -104,7 +104,7 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
      * @param prc the profile request context
      * @return the map of requested attributes or <code>null</code>
      */
-    @Nullable protected Multimap<String, IdPRequestedAttribute>
+    @Nullable protected Multimap<String, IdPAttribute>
             getRequestedAttributes(@Nullable final ProfileRequestContext prc) {
         if (prc != null) {
             final SAMLMetadataContext metadataContext = metadataContextLookupStrategy.apply(prc);
@@ -128,10 +128,11 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
     /** {@inheritDoc} */
     public boolean test(@Nullable final IdPAttribute input) {
         if (input != null && requestedAttributesMap != null && !requestedAttributesMap.isEmpty()) {
-            final Collection<IdPRequestedAttribute> requestedAttrs = requestedAttributesMap.get(input.getId());
+            final Collection<IdPAttribute> requestedAttrs = requestedAttributesMap.get(input.getId());
             if (requestedAttrs != null) {
-                for (final IdPRequestedAttribute requestedAttr : requestedAttrs) {
-                    if (requestedAttr != null && requestedAttr.getIsRequired()) {
+                for (final IdPAttribute requestedAttr : requestedAttrs) {
+                    if (requestedAttr instanceof IdPRequestedAttribute
+                            && ((IdPRequestedAttribute) requestedAttr).getIsRequired()) {
                         log.debug("Attribute '{}' is required", input);
                         return true;
                     }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/MessageSourceConsentFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/MessageSourceConsentFunction.java
index 1153316..0086610 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/MessageSourceConsentFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/MessageSourceConsentFunction.java
@@ -159,9 +159,8 @@ public class MessageSourceConsentFunction extends AbstractInitializableComponent
             }
     
             return Collections.singletonMap(id, consent);
-        } else {
-            return Collections.emptyMap();
         }
+        return Collections.emptyMap();
     }
     
 
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
index c46412a..f2850f8 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
@@ -48,7 +48,7 @@ import com.google.common.collect.Ordering;
 public class PreferExplicitOrderComparator implements Comparator<String> {
 
     /** Explicit ordering. */
-    @Nullable private Ordering explicitOrdering;
+    @Nullable private Ordering<String> explicitOrdering;
 
     /** Strings in order. */
     @Nonnull @NonnullElements @Unmodifiable private List<String> explicitOrder;
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializer.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializer.java
index 6175f56..724a30a 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializer.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializer.java
@@ -77,14 +77,14 @@ public class CollectionSerializer extends AbstractInitializableComponent impleme
         final Collection<String> filteredInstance = Collections2.filter(instance, Predicates.notNull());
 
         final StringWriter sink = new StringWriter(128);
-        final JsonGenerator gen = generatorFactory.createGenerator(sink);
-
-        gen.writeStartArray();
-        for (final String element : filteredInstance) {
-            gen.write(element);
+        
+        try (final JsonGenerator gen = generatorFactory.createGenerator(sink)) {
+            gen.writeStartArray();
+            for (final String element : filteredInstance) {
+                gen.write(element);
+            }
+            gen.writeEnd();
         }
-        gen.writeEnd();
-        gen.close();
 
         final String serialized = sink.toString();
         log.debug("Serialized '{}' as '{}'", instance, serialized);
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializer.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializer.java
index 2d11035..4162064 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializer.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializer.java
@@ -183,27 +183,27 @@ public class ConsentSerializer extends AbstractInitializableComponent implements
         Constraint.isNotEmpty(filteredConsents, "Consents cannot be empty");
 
         final StringWriter sink = new StringWriter(128);
-        final JsonGenerator gen = generatorFactory.createGenerator(sink);
-
-        gen.writeStartArray();
-        for (final Consent consent : filteredConsents) {
-            gen.writeStartObject();
-            final Integer symbol = symbolics.get(consent.getId());
-            if (symbol != null) {
-                gen.write(ID_FIELD, symbol);
-            } else {
-                gen.write(ID_FIELD, consent.getId());
-            }
-            if (consent.getValue() != null) {
-                gen.write(VALUE_FIELD, consent.getValue());
-            }
-            if (!consent.isApproved()) {
-                gen.write(IS_APPROVED_FIELD, false);
+        
+        try (final JsonGenerator gen = generatorFactory.createGenerator(sink)) {
+            gen.writeStartArray();
+            for (final Consent consent : filteredConsents) {
+                gen.writeStartObject();
+                final Integer symbol = symbolics.get(consent.getId());
+                if (symbol != null) {
+                    gen.write(ID_FIELD, symbol);
+                } else {
+                    gen.write(ID_FIELD, consent.getId());
+                }
+                if (consent.getValue() != null) {
+                    gen.write(VALUE_FIELD, consent.getValue());
+                }
+                if (!consent.isApproved()) {
+                    gen.write(IS_APPROVED_FIELD, false);
+                }
+                gen.writeEnd();
             }
             gen.writeEnd();
         }
-        gen.writeEnd();
-        gen.close();
 
         final String serialized = sink.toString();
         log.debug("Serialized '{}' as '{}'", consents, serialized);
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContextTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContextTest.java
index 3a8ae20..4b14562 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContextTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContextTest.java
@@ -88,7 +88,7 @@ public class PopulateAttributeReleaseContextTest extends AbstractAttributeReleas
 
     @Test public void testDefaultNaturalAttributeOrdering() throws Exception {
 
-        final Map<String, IdPAttribute> orderedAttributes = new TreeMap(Ordering.natural());
+        final Map<String, IdPAttribute> orderedAttributes = new TreeMap<>(Ordering.natural());
         orderedAttributes.putAll(ConsentTestingSupport.newAttributeMap());
 
         action = new PopulateAttributeReleaseContext();
@@ -108,7 +108,7 @@ public class PopulateAttributeReleaseContextTest extends AbstractAttributeReleas
 
         final List<String> attributeOrder = Arrays.asList("attribute2", "attribute3", "attribute1");
 
-        final Map<String, IdPAttribute> orderedAttributes = new TreeMap(Ordering.explicit(attributeOrder));
+        final Map<String, IdPAttribute> orderedAttributes = new TreeMap<>(Ordering.explicit(attributeOrder));
         orderedAttributes.putAll(ConsentTestingSupport.newAttributeMap());
 
         action = new PopulateAttributeReleaseContext();
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageActionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageActionTest.java
index 03f7c23..c988c16 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageActionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageActionTest.java
@@ -39,7 +39,7 @@ public abstract class AbstractConsentIndexedStorageActionTest extends AbstractCo
     }
 
     protected Collection<String> readStorageKeysFromIndex() throws IOException {
-        final StorageRecord index = getMemoryStorageService().read("context", "_index");
+        final StorageRecord<?> index = getMemoryStorageService().read("context", "_index");
         Assert.assertNotNull(index);
 
         final CollectionSerializer collectionSerializer =
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageActionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageActionTest.java
index 9a53bab..b2d93d8 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageActionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentStorageActionTest.java
@@ -66,7 +66,7 @@ public abstract class AbstractConsentStorageActionTest extends AbstractConsentAc
     }
 
     protected Map<String, Consent> readConsentsFromStorage() throws IOException {
-        final StorageRecord record = getMemoryStorageService().read("context", "key");
+        final StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertNotNull(record);
 
         final ConsentSerializer consentSerializer =
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/CreateResultTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/CreateResultTest.java
index 57b58d9..fc990f6 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/CreateResultTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/CreateResultTest.java
@@ -44,16 +44,16 @@ import org.testng.annotations.Test;
 public class CreateResultTest extends AbstractConsentIndexedStorageActionTest {
 
     protected CreateResult buildAction(@Nonnull final String key) throws Exception {
-        final CreateResult action = new CreateResult();
-        action.setStorageContextLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant("context"));
-        action.setStorageKeyLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant(key));
-        action.setStorageIndexKeyLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant("_index"));
-        action.initialize();
-        return action;
+        final CreateResult action1 = new CreateResult();
+        action1.setStorageContextLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant("context"));
+        action1.setStorageKeyLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant(key));
+        action1.setStorageIndexKeyLookupStrategy(FunctionSupport.<ProfileRequestContext, String> constant("_index"));
+        action1.initialize();
+        return action1;
     }
 
     protected Map<String, Consent> readConsentFromStorage(@Nonnull final String key) throws Exception {
-        final StorageRecord record = getMemoryStorageService().read("context", key);
+        final StorageRecord<?> record = getMemoryStorageService().read("context", key);
         Assert.assertNotNull(record);
         final ConsentSerializer serializer = new ConsentSerializer();
 
@@ -76,7 +76,7 @@ public class CreateResultTest extends AbstractConsentIndexedStorageActionTest {
         Assert.assertNotNull(pic);
         Assert.assertEquals(pic.getResults().size(), 0);
 
-        final StorageRecord record = getMemoryStorageService().read("context", "key");
+        final StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertNull(record);
     }
 
@@ -110,7 +110,7 @@ public class CreateResultTest extends AbstractConsentIndexedStorageActionTest {
 
         testCreateResult();
 
-        final StorageRecord record = getMemoryStorageService().read("context", "key");
+        final StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertEquals(record.getValue(),
                 "[{\"id\":101,\"v\":\"value1\",\"appr\":false},{\"id\":102,\"v\":\"value2\",\"appr\":false}]");
     }
@@ -144,7 +144,7 @@ public class CreateResultTest extends AbstractConsentIndexedStorageActionTest {
 
         testUpdateResult();
 
-        final StorageRecord record = getMemoryStorageService().read("context", "key");
+        final StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertEquals(record.getValue(),
                 "[{\"id\":101,\"v\":\"value1\",\"appr\":false},{\"id\":102,\"v\":\"value2\",\"appr\":false}]");
     }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounterTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounterTest.java
index 8b1af36..4f902b7 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounterTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/UpdateCounterTest.java
@@ -40,7 +40,7 @@ public class UpdateCounterTest extends AbstractConsentStorageActionTest {
 
         ActionTestingSupport.assertProceedEvent(event);
 
-        final StorageRecord record = getMemoryStorageService().read("context", "key");
+        final StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertNotNull(record);
         Assert.assertEquals(record.getVersion(), 1);
     }
@@ -52,7 +52,7 @@ public class UpdateCounterTest extends AbstractConsentStorageActionTest {
 
         ActionTestingSupport.assertProceedEvent(event);
 
-        StorageRecord record = getMemoryStorageService().read("context", "key");
+        StorageRecord<?> record = getMemoryStorageService().read("context", "key");
         Assert.assertNotNull(record);
         Assert.assertEquals(record.getVersion(), 1);
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunctionTest.java
index 312debf..75741c8 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/CounterStorageKeyFunctionTest.java
@@ -100,7 +100,7 @@ public class CounterStorageKeyFunctionTest {
 
         keys = Arrays.asList("key1", "key2", "key3", "key4");
 
-        input = new Pair(prc, keys);
+        input = new Pair<>(prc, keys);
 
         f = new CounterStorageKeyFunction();
     }
@@ -128,7 +128,7 @@ public class CounterStorageKeyFunctionTest {
     @Test public void testNullProfileRequestContextInput() throws Exception {
         f.initialize();
 
-        final List<String> sortedKeys = f.apply(new Pair(null, keys));
+        final List<String> sortedKeys = f.apply(new Pair<>(null, keys));
 
         Assert.assertNull(sortedKeys);
     }
@@ -136,7 +136,7 @@ public class CounterStorageKeyFunctionTest {
     @Test public void testNullKeysInput() throws Exception {
         f.initialize();
 
-        final List<String> sortedKeys = f.apply(new Pair(prc, null));
+        final List<String> sortedKeys = f.apply(new Pair<>(prc, null));
 
         Assert.assertNull(sortedKeys);
     }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunctionTest.java
index c0802b2..00f587f 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowDescriptorLookupFunctionTest.java
@@ -53,18 +53,18 @@ public class FlowDescriptorLookupFunctionTest {
         pic.setAttemptedFlow(new ConsentFlowDescriptor());
 
         final FlowDescriptorLookupFunction<ConsentFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(ConsentFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
 
         final ConsentFlowDescriptor flow = strategy.apply(prc);
 
-        Assert.assertTrue(flow instanceof ConsentFlowDescriptor);
+        Assert.assertNotNull(flow);
     }
 
     @Test public void testLookupChild() {
         pic.setAttemptedFlow(new ConsentFlowDescriptor());
 
         final FlowDescriptorLookupFunction<AttributeReleaseFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(AttributeReleaseFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(AttributeReleaseFlowDescriptor.class);
 
         final AttributeReleaseFlowDescriptor flow = strategy.apply(prc);
 
@@ -75,17 +75,17 @@ public class FlowDescriptorLookupFunctionTest {
         pic.setAttemptedFlow(new AttributeReleaseFlowDescriptor());
 
         final FlowDescriptorLookupFunction<ConsentFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(ConsentFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
 
         final ConsentFlowDescriptor flow = strategy.apply(prc);
 
-        Assert.assertTrue(flow instanceof ConsentFlowDescriptor);
+        Assert.assertNotNull(flow);
     }
 
     @Test public void testNullInput() {
 
         final FlowDescriptorLookupFunction<ConsentFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(ConsentFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
 
         final ConsentFlowDescriptor flow = strategy.apply(null);
 
@@ -96,7 +96,7 @@ public class FlowDescriptorLookupFunctionTest {
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
 
         final FlowDescriptorLookupFunction<ConsentFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(ConsentFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
 
         final ConsentFlowDescriptor flow = strategy.apply(null);
 
@@ -106,7 +106,7 @@ public class FlowDescriptorLookupFunctionTest {
     @Test public void testNoAttemptedFlow() {
 
         final FlowDescriptorLookupFunction<ConsentFlowDescriptor> strategy =
-                new FlowDescriptorLookupFunction(ConsentFlowDescriptor.class);
+                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
 
         final ConsentFlowDescriptor flow = strategy.apply(null);
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
index 0389473..7945524 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
@@ -30,7 +30,7 @@ import org.testng.annotations.Test;
 /** {@link PreferExplicitOrderComparator} unit test. */
 public class PreferExplicitOrderComparatorTest {
 
-    private Comparator c;
+    private Comparator<String> c;
 
     private List<String> valuesInOrder;
 
@@ -86,7 +86,7 @@ public class PreferExplicitOrderComparatorTest {
 
     @Test public void testExplicitOrderingWithKnownValuesOnly() {
 
-        toBeSorted = new ArrayList(valuesInOrder);
+        toBeSorted = new ArrayList<>(valuesInOrder);
 
         Collections.shuffle(toBeSorted);
 
diff --git a/idp-core/.settings/org.eclipse.jdt.core.prefs b/idp-core/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-core/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-core/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-core/src/main/java/net/shibboleth/idp/cli/CLI.java b/idp-core/src/main/java/net/shibboleth/idp/cli/CLI.java
index 8b06d92..7542549 100644
--- a/idp-core/src/main/java/net/shibboleth/idp/cli/CLI.java
+++ b/idp-core/src/main/java/net/shibboleth/idp/cli/CLI.java
@@ -65,7 +65,7 @@ public final class CLI {
         CommandLineArguments argObject = null;
         
         try {
-            final Constructor construct = Class.forName(argType).getConstructor();
+            final Constructor<?> construct = Class.forName(argType).getConstructor();
             final Object obj = construct.newInstance();
             if (!(obj instanceof CommandLineArguments)) {
                 errorAndExit("Argument class was not of the correct type");
diff --git a/idp-core/src/main/java/net/shibboleth/idp/metrics/ReloadableServiceGaugeSet.java b/idp-core/src/main/java/net/shibboleth/idp/metrics/ReloadableServiceGaugeSet.java
index e4eb035..3cf366d 100644
--- a/idp-core/src/main/java/net/shibboleth/idp/metrics/ReloadableServiceGaugeSet.java
+++ b/idp-core/src/main/java/net/shibboleth/idp/metrics/ReloadableServiceGaugeSet.java
@@ -53,7 +53,7 @@ public class ReloadableServiceGaugeSet<T> extends AbstractInitializableComponent
     @Nonnull @NonnullElements private final Map<String,Metric> gauges;
     
     /** The service to report on. */
-    @NonnullAfterInit private ReloadableService service;
+    @NonnullAfterInit private ReloadableService<T> service;
     
     /** The log Prefix. */
     @Nonnull @NotEmpty private final String logPrefix;
@@ -108,7 +108,7 @@ public class ReloadableServiceGaugeSet<T> extends AbstractInitializableComponent
      * 
      * @param svc service instance
      */
-    public void setService(@Nonnull final ReloadableService svc) {
+    public void setService(@Nonnull final ReloadableService<T> svc) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         service = Constraint.isNotNull(svc, "ReloadableService cannot be null");
diff --git a/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java b/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
index 42368ff..f5eecf1 100644
--- a/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
+++ b/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
@@ -96,10 +96,9 @@ public class IdPPropertiesApplicationContextInitializer
                 if (isFailFast(applicationContext)) {
                     log.error("Unable to load properties from resource '{}'", resource);
                     throw new ConstraintViolationException("Unable to load properties from resource");
-                } else {
-                    log.warn("Unable to load properties from resource '{}'", resource);
-                    return;
                 }
+                log.warn("Unable to load properties from resource '{}'", resource);
+                return;
             }
 
             if ("classpath:".equals(searchLocation) || (resource instanceof ClassPathResource)) {
@@ -223,10 +222,9 @@ public class IdPPropertiesApplicationContextInitializer
                         if (isFailFast(applicationContext)) {
                             log.error("Unable to load properties from resource '{}'", additionalResource);
                             throw new ConstraintViolationException("Unable to load properties from resource");
-                        } else {
-                            log.warn("Unable to load properties from resource '{}'", additionalResource);
-                            continue;
                         }
+                        log.warn("Unable to load properties from resource '{}'", additionalResource);
+                        continue;
                     }
                 } else {
                     log.warn("Unable to find resource '{}'", additionalResource);
diff --git a/idp-distribution/.settings/org.eclipse.jdt.core.prefs b/idp-distribution/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-distribution/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-distribution/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-installer/.settings/org.eclipse.jdt.core.prefs b/idp-installer/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-installer/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-installer/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/MergePropertiesTask.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/MergePropertiesTask.java
index a135d1a..f889c3f 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/MergePropertiesTask.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/MergePropertiesTask.java
@@ -94,20 +94,16 @@ public class MergePropertiesTask extends Task {
         
         final PropertiesWithComments in = new PropertiesWithComments(); 
 
-        try {
-            final FileInputStream stream = new FileInputStream(inFile);
+        try (final FileInputStream stream = new FileInputStream(inFile)) {
             in.load(stream);
-            stream.close();
         } catch (final IOException e) {
             log("Could not load input " + inFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
         }
         
         final Properties merge = new Properties(); 
-        try {
-            final FileInputStream stream = new FileInputStream(mergeFile);
+        try (final FileInputStream stream = new FileInputStream(mergeFile)) {
             merge.load(stream);
-            stream.close();
         } catch (final IOException e) {
             log("Could not load merge " + mergeFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
@@ -121,10 +117,8 @@ public class MergePropertiesTask extends Task {
             } 
         }
 
-        try {
-            final FileOutputStream stream = new FileOutputStream(outFile);
+        try (final FileOutputStream stream = new FileOutputStream(outFile)) {
             in.store(stream);
-            stream.close();
         } catch (final IOException e) {
             log("Could not store output " + outFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/RewritePropertiesTask.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/RewritePropertiesTask.java
index bda46fc..be47b4f 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/RewritePropertiesTask.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/ant/impl/RewritePropertiesTask.java
@@ -93,28 +93,22 @@ public class RewritePropertiesTask extends Task {
         }
         
         final PropertiesWithComments properties = new PropertiesWithComments(); 
-        try {
-            final InputStream in = new FileInputStream(propertyNameFile);
+        try (final InputStream in = new FileInputStream(propertyNameFile)) {
             properties.loadNameReplacement(in);
-            in.close();
         } catch (final IOException e) {
             log("Could not load name replacements " + propertyNameFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
         }
 
-        try {
-            final InputStream in = new FileInputStream(inFile); 
+        try (final InputStream in = new FileInputStream(inFile)) { 
             properties.load(in);
-            in.close();
         } catch (final IOException e) {
             log("Could not load input " + inFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
         }
         
-        try {
-            final FileOutputStream out = new FileOutputStream(outFile);
+        try (final FileOutputStream out = new FileOutputStream(outFile)) {
             properties.store(out);
-            out.close();
         } catch (final IOException e) {
             log("Could not store output " + outFile.getAbsolutePath(), e, Project.MSG_ERR);
             throw new BuildException(e);
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/PropertiesWithComments.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/PropertiesWithComments.java
index 87e17c2..84353fc 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/PropertiesWithComments.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/PropertiesWithComments.java
@@ -176,20 +176,19 @@ public class PropertiesWithComments {
      * @throws IOException is the write fails
      */
     public void store(final OutputStream output) throws IOException {
-        final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));
-
-        for (final Object o : contents) {
-            if (o instanceof String) {
-                writer.write((String) o);
-            } else if (o instanceof CommentedProperty) {
-                final CommentedProperty commentedProperty = (CommentedProperty) o;
-                commentedProperty.write(writer);
+        
+        try (final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output))) {
+            for (final Object o : contents) {
+                if (o instanceof String) {
+                    writer.write((String) o);
+                } else if (o instanceof CommentedProperty) {
+                    final CommentedProperty commentedProperty = (CommentedProperty) o;
+                    commentedProperty.write(writer);
+                }
+                writer.newLine();
             }
-            writer.newLine();
+            writer.flush();
         }
-        writer.flush();
-        writer.close();
-        output.close();
     }
 
     /**
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorParameters.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorParameters.java
index 3f4047b..fa06fe6 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorParameters.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorParameters.java
@@ -157,10 +157,9 @@ public class MetadataGeneratorParameters {
         if (null == file || !file.exists()) {
             return null;
         }
-        final FileReader fr = new FileReader(file);
-        final BufferedReader reader = new BufferedReader(fr);
 
-        try {
+        try (final FileReader fr = new FileReader(file);
+                final BufferedReader reader = new BufferedReader(fr)) {
             final List<String> output = new ArrayList<>();
             String s = reader.readLine();
             while (s != null) {
@@ -178,13 +177,6 @@ public class MetadataGeneratorParameters {
                 output.remove(last);
             }
             return output;
-
-        } finally {
-            try {
-                reader.close();
-                fr.close();
-            } catch (final IOException e1) {
-            }
         }
     }
 
diff --git a/idp-profile-api/.settings/org.eclipse.jdt.core.prefs b/idp-profile-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-profile-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-profile-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
index da11ef6..e0ef004 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
@@ -181,7 +181,7 @@ public abstract class AbstractProfileAction
             } else if (event instanceof String) {
                 return ActionSupport.buildEvent(action, (String) eventCtx.getEvent());
             } else if (event instanceof AttributeMap) {
-                final AttributeMap map = (AttributeMap) eventCtx.getEvent();
+                final AttributeMap<Object> map = (AttributeMap<Object>) eventCtx.getEvent();
                 return ActionSupport.buildEvent(action, map.getString("eventId", EventIds.PROCEED_EVENT_ID), map); 
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
index 6cc6a63..c245a12 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ActionSupport.java
@@ -69,7 +69,7 @@ public final class ActionSupport {
      * @return the constructed {@link Event}
      */
     @Nonnull public static Event buildEvent(@Nonnull final Object source, @Nonnull final String eventId,
-            @Nonnull final AttributeMap eventAttributes) {
+            @Nonnull final AttributeMap<Object> eventAttributes) {
         Constraint.isNotNull(source, "Component cannot be null");
 
         final String trimmedEventId =
@@ -77,9 +77,8 @@ public final class ActionSupport {
 
         if (eventAttributes == null || eventAttributes.isEmpty()) {
             return new Event(source, trimmedEventId);
-        } else {
-            return new Event(source, trimmedEventId, eventAttributes);
         }
+        return new Event(source, trimmedEventId, eventAttributes);
     }
     
 }
\ No newline at end of file
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
index d71cd39..000c9da 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/ScriptedAction.java
@@ -130,7 +130,7 @@ public class ScriptedAction extends AbstractProfileAction {
             ActionSupport.buildProceedEvent(profileContext);
         } else {
             log.debug("{} signaled event: {}", getLogPrefix(), result);
-            ActionSupport.buildEvent(profileContext, (String) result);
+            ActionSupport.buildEvent(profileContext, result);
         }
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
index e8f122b..187becb 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/MultiRelyingPartyContext.java
@@ -138,9 +138,8 @@ public final class MultiRelyingPartyContext extends BaseContext {
         
         if (relyingPartyIterator != null) {
             return ((RelyingPartyContextIterator) relyingPartyIterator).current;
-        } else {
-            return null;
         }
+        return null;
     }
     
     /**
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
index 279ac32..9f87b76 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ScriptedContextLookupFunction.java
@@ -83,7 +83,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @param outputType the type to test against.
      */
     protected ScriptedContextLookupFunction(@Nonnull final Class<T> inClass, @Nonnull final EvaluableScript theScript,
-            @Nullable final String extraInfo, @Nullable final Class outputType) {
+            @Nullable final String extraInfo, @Nullable final Class<?> outputType) {
         this(inClass, theScript, extraInfo);
         setOutputType(outputType);
     }
@@ -143,10 +143,10 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      */
     @Nonnull static ScriptedContextLookupFunction<ProfileRequestContext> resourceScript(
             @Nonnull @NotEmpty final String engineName, @Nonnull final Resource resource,
-            @Nullable final Class outputType) throws ScriptException, IOException {
+            @Nullable final Class<?> outputType) throws ScriptException, IOException {
         try (InputStream is = resource.getInputStream()) {
             final EvaluableScript script = new EvaluableScript(engineName, is);
-            return new ScriptedContextLookupFunction(ProfileRequestContext.class, script, resource.getDescription(),
+            return new ScriptedContextLookupFunction<>(ProfileRequestContext.class, script, resource.getDescription(),
                 outputType);
         }
     }
@@ -175,7 +175,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @throws IOException if the file doesn't exist.
      */
     @Nonnull static ScriptedContextLookupFunction<ProfileRequestContext> resourceScript(final Resource resource,
-            @Nullable final Class outputType) throws ScriptException, IOException {
+            @Nullable final Class<?> outputType) throws ScriptException, IOException {
         return resourceScript(DEFAULT_ENGINE, resource, outputType);
     }
 
@@ -191,7 +191,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
             @Nonnull @NotEmpty final String engineName, @Nonnull @NotEmpty final String scriptSource)
             throws ScriptException {
         final EvaluableScript script = new EvaluableScript(engineName, scriptSource);
-        return new ScriptedContextLookupFunction(ProfileRequestContext.class, script, "Inline");
+        return new ScriptedContextLookupFunction<>(ProfileRequestContext.class, script, "Inline");
     }
 
     /**
@@ -205,9 +205,9 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      */
     @Nonnull static ScriptedContextLookupFunction<ProfileRequestContext> inlineScript(
             @Nonnull @NotEmpty final String engineName, @Nonnull @NotEmpty final String scriptSource,
-            @Nullable final Class outputType) throws ScriptException {
+            @Nullable final Class<?> outputType) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(engineName, scriptSource);
-        return new ScriptedContextLookupFunction(ProfileRequestContext.class, script, "Inline", outputType);
+        return new ScriptedContextLookupFunction<>(ProfileRequestContext.class, script, "Inline", outputType);
     }
 
     /**
@@ -220,7 +220,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
     @Nonnull static ScriptedContextLookupFunction<ProfileRequestContext> inlineScript(
             @Nonnull @NotEmpty final String scriptSource) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(DEFAULT_ENGINE, scriptSource);
-        return new ScriptedContextLookupFunction(ProfileRequestContext.class, script, "Inline");
+        return new ScriptedContextLookupFunction<>(ProfileRequestContext.class, script, "Inline");
     }
 
     /**
@@ -232,9 +232,9 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @throws ScriptException if the compile fails
      */
     @Nonnull static ScriptedContextLookupFunction<ProfileRequestContext> inlineScript(
-            @Nonnull @NotEmpty final String scriptSource, @Nullable final Class outputType) throws ScriptException {
+            @Nonnull @NotEmpty final String scriptSource, @Nullable final Class<?> outputType) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(DEFAULT_ENGINE, scriptSource);
-        return new ScriptedContextLookupFunction(ProfileRequestContext.class, script, "Inline", outputType);
+        return new ScriptedContextLookupFunction<>(ProfileRequestContext.class, script, "Inline", outputType);
     }
 
     /**
@@ -264,10 +264,10 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      */
     @Nonnull static ScriptedContextLookupFunction<MessageContext> resourceMessageContextScript(
             @Nonnull @NotEmpty final String engineName, @Nonnull final Resource resource,
-            @Nullable final Class outputType) throws ScriptException, IOException {
+            @Nullable final Class<?> outputType) throws ScriptException, IOException {
         try (InputStream is = resource.getInputStream()) {
             final EvaluableScript script = new EvaluableScript(engineName, is);
-            return new ScriptedContextLookupFunction(MessageContext.class, script, resource.getDescription(),
+            return new ScriptedContextLookupFunction<>(MessageContext.class, script, resource.getDescription(),
                     outputType);
         }
     }
@@ -280,7 +280,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @throws ScriptException if the compile fails
      * @throws IOException if the file doesn't exist.
      */
-    @Nonnull static ScriptedContextLookupFunction resourceMessageContextScript(final Resource resource)
+    @Nonnull static ScriptedContextLookupFunction<MessageContext> resourceMessageContextScript(final Resource resource)
             throws ScriptException, IOException {
         return resourceMessageContextScript(DEFAULT_ENGINE, resource, null);
     }
@@ -295,7 +295,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @throws IOException if the file doesn't exist.
      */
     @Nonnull static ScriptedContextLookupFunction<MessageContext> resourceMessageContextScript(final Resource resource,
-            @Nullable final Class outputType) throws ScriptException, IOException {
+            @Nullable final Class<?> outputType) throws ScriptException, IOException {
         return resourceMessageContextScript(DEFAULT_ENGINE, resource, outputType);
     }
 
@@ -311,7 +311,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
             @Nonnull @NotEmpty final String engineName, @Nonnull @NotEmpty final String scriptSource)
             throws ScriptException {
         final EvaluableScript script = new EvaluableScript(engineName, scriptSource);
-        return new ScriptedContextLookupFunction(MessageContext.class, script, "Inline");
+        return new ScriptedContextLookupFunction<>(MessageContext.class, script, "Inline");
     }
 
     /**
@@ -325,9 +325,9 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      */
     @Nonnull static ScriptedContextLookupFunction<MessageContext> inlineMessageContextScript(
             @Nonnull @NotEmpty final String engineName, @Nonnull @NotEmpty final String scriptSource,
-            @Nullable final Class outputType) throws ScriptException {
+            @Nullable final Class<?> outputType) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(engineName, scriptSource);
-        return new ScriptedContextLookupFunction(MessageContext.class, script, "Inline", outputType);
+        return new ScriptedContextLookupFunction<>(MessageContext.class, script, "Inline", outputType);
     }
 
     /**
@@ -340,7 +340,7 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
     @Nonnull static ScriptedContextLookupFunction<MessageContext> inlineMessageContextScript(
             @Nonnull @NotEmpty final String scriptSource) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(DEFAULT_ENGINE, scriptSource);
-        return new ScriptedContextLookupFunction(MessageContext.class, script, "Inline");
+        return new ScriptedContextLookupFunction<>(MessageContext.class, script, "Inline");
     }
 
     /**
@@ -352,9 +352,9 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
      * @throws ScriptException if the compile fails
      */
     @Nonnull static ScriptedContextLookupFunction<MessageContext> inlineMessageContextScript(
-            @Nonnull @NotEmpty final String scriptSource, @Nullable final Class outputType) throws ScriptException {
+            @Nonnull @NotEmpty final String scriptSource, @Nullable final Class<?> outputType) throws ScriptException {
         final EvaluableScript script = new EvaluableScript(DEFAULT_ENGINE, scriptSource);
-        return new ScriptedContextLookupFunction(MessageContext.class, script, "Inline", outputType);
+        return new ScriptedContextLookupFunction<>(MessageContext.class, script, "Inline", outputType);
     }
 
 }
\ No newline at end of file
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
index ac673df..ee82674 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/AbstractProfileInterceptorAction.java
@@ -57,7 +57,7 @@ public abstract class AbstractProfileInterceptorAction extends
 
     /** Constructor. */
     public AbstractProfileInterceptorAction() {
-        interceptorContextlookupStrategy = new ChildContextLookup(ProfileInterceptorContext.class, true);
+        interceptorContextlookupStrategy = new ChildContextLookup<>(ProfileInterceptorContext.class, true);
     }
 
     /**
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DynamicAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DynamicAttributePredicate.java
index f58cd06..d31f89b 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DynamicAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/DynamicAttributePredicate.java
@@ -155,13 +155,12 @@ public class DynamicAttributePredicate extends AbstractAttributePredicate {
         if ("*".equals(toMatch)) {
             log.debug("Wildcard (*) value rule for attribute {}", attribute.getId());
             return true;
-        } else {
-            for (final IdPAttributeValue value : attribute.getValues()) {
-                if (value instanceof StringAttributeValue) {
-                    if (toMatch.equals(((StringAttributeValue)value).getValue())) {
-                        log.debug("Found matching value ({}) in attribute {}", toMatch, attribute.getId());
-                        return true;
-                    }
+        }
+        for (final IdPAttributeValue value : attribute.getValues()) {
+            if (value instanceof StringAttributeValue) {
+                if (toMatch.equals(((StringAttributeValue)value).getValue())) {
+                    log.debug("Found matching value ({}) in attribute {}", toMatch, attribute.getId());
+                    return true;
                 }
             }
         }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
index b81b82c..744026e 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RegexAttributePredicate.java
@@ -113,7 +113,7 @@ public class RegexAttributePredicate extends AbstractAttributePredicate {
         
         for (final IdPAttributeValue value : attribute.getValues()) {
             if (value instanceof StringAttributeValue) {
-                final Matcher m = pattern.matcher((String) ((StringAttributeValue)value).getValue());
+                final Matcher m = pattern.matcher(((StringAttributeValue)value).getValue());
                 if (m.matches()) {
                     log.debug("Found matching value '{}' in attribute '{}'", m.group(), attributeId);
                     return true;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
index 56fc488..b31a56c 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/SimpleAttributePredicate.java
@@ -125,13 +125,12 @@ public class SimpleAttributePredicate extends AbstractAttributePredicate {
         if ("*".equals(toMatch)) {
             log.debug("Wildcard (*) value rule for attribute {}", attribute.getId());
             return true;
-        } else {
-            for (final IdPAttributeValue value : attribute.getValues()) {
-                if (value instanceof StringAttributeValue) {
-                    if (toMatch.equals(((StringAttributeValue)value).getValue())) {
-                        log.debug("Found matching value ({}) in attribute {}", toMatch, attribute.getId());
-                        return true;
-                    }
+        }
+        for (final IdPAttributeValue value : attribute.getValues()) {
+            if (value instanceof StringAttributeValue) {
+                if (toMatch.equals(((StringAttributeValue)value).getValue())) {
+                    log.debug("Found matching value ({}) in attribute {}", toMatch, attribute.getId());
+                    return true;
                 }
             }
         }
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/AbstractProfileActionTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/AbstractProfileActionTest.java
index ec5eb97..fab5ff3 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/AbstractProfileActionTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/AbstractProfileActionTest.java
@@ -103,9 +103,9 @@ public class AbstractProfileActionTest {
             prevEvent = null;
         }
 
-        public MockProfileAction(String newEvent, String prevEvent) {
-            this.newEvent = newEvent;
-            this.prevEvent = prevEvent;
+        public MockProfileAction(String newEv, String prev) {
+            newEvent = newEv;
+            prevEvent = prev;
             thrownException = null;
         }
         
@@ -119,7 +119,7 @@ public class AbstractProfileActionTest {
 
             executed = true;
             
-            final PreviousEventContext prevCtx = profileRequestContext.getSubcontext(PreviousEventContext.class, false);
+            final PreviousEventContext<?> prevCtx = profileRequestContext.getSubcontext(PreviousEventContext.class, false);
             if (prevEvent != null) {
                 if (prevCtx == null || !prevCtx.getEvent().equals(prevEvent)) {
                     org.opensaml.profile.action.ActionSupport.buildEvent(profileRequestContext, "InvalidPreviousEvent");
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/RequestContextBuilder.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/RequestContextBuilder.java
index 73d2a45..953666c 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/RequestContextBuilder.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/RequestContextBuilder.java
@@ -286,7 +286,7 @@ public class RequestContextBuilder {
         final MockRequestContext context = new MockRequestContext();
         context.setExternalContext(buildServletExternalContext());
 
-        final MutableAttributeMap scope = context.getConversationScope();
+        final MutableAttributeMap<Object> scope = context.getConversationScope();
         scope.put(ProfileRequestContext.BINDING_KEY, buildProfileRequestContext());
 
         return context;
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/ScriptedFunctionTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/ScriptedFunctionTest.java
index 40b50b0..7c95b0b 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/ScriptedFunctionTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/ScriptedFunctionTest.java
@@ -54,7 +54,7 @@ public class ScriptedFunctionTest {
 
     
     @Test public void simpleScript() throws ScriptException {
-        ProfileRequestContext prc = new ProfileRequestContext();
+        final ProfileRequestContext prc = new ProfileRequestContext();
         
         final Object string = ScriptedContextLookupFunction.inlineScript(stringReturn()).apply(prc);
 
@@ -66,9 +66,9 @@ public class ScriptedFunctionTest {
     }
     
     @Test public void custom() throws ScriptException {
-        ProfileRequestContext prc = new ProfileRequestContext();
+        final ProfileRequestContext prc = new ProfileRequestContext();
         
-        final ScriptedContextLookupFunction script = ScriptedContextLookupFunction.inlineScript("custom;");
+        final ScriptedContextLookupFunction<ProfileRequestContext> script = ScriptedContextLookupFunction.inlineScript("custom;");
         script.setCustomObject("String");
         Assert.assertEquals(script.apply(prc), "String");
  
@@ -78,9 +78,9 @@ public class ScriptedFunctionTest {
     
     
     @Test public void withType() throws ScriptException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
-        ProfileRequestContext prc = new ProfileRequestContext();
+        final ProfileRequestContext prc = new ProfileRequestContext();
 
-        final ScriptedContextLookupFunction script1 = ScriptedContextLookupFunction.inlineScript(stringReturn(), Object.class);
+        final ScriptedContextLookupFunction<ProfileRequestContext> script1 = ScriptedContextLookupFunction.inlineScript(stringReturn(), Object.class);
         
         final String string = (String) script1.apply(prc);
         Assert.assertEquals(string, "String");
@@ -93,13 +93,6 @@ public class ScriptedFunctionTest {
         Assert.assertEquals(integer.intValue(), 37);
         
     }
-    
-    @Test(expectedExceptions={ClassCastException.class,}) public void wrongType() throws ScriptException {
-        final ScriptedContextLookupFunction script1 = ScriptedContextLookupFunction.inlineScript(stringReturn(), Object.class);
-        
-        script1.apply(new MessageContext());
-        
-    }
 
     @Test public void messageContext() throws ScriptException {
         final ScriptedContextLookupFunction<MessageContext> script1 = ScriptedContextLookupFunction.inlineMessageContextScript(stringReturn(), Object.class);
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunctionTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunctionTest.java
index 642fd8a..2f31fed 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunctionTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunctionTest.java
@@ -28,11 +28,9 @@ public class SpringExpressionContextLookupFunctionTest {
 
     
     @Test public void simpleTest() {
-        SpringExpressionContextLookupFunction func = new SpringExpressionContextLookupFunction(Integer.class, "#input", Integer.class);
-
-        func = new SpringExpressionContextLookupFunction(ProfileRequestContext.class, "99", Integer.class);
-        
+        SpringExpressionContextLookupFunction<ProfileRequestContext> func =
+                new SpringExpressionContextLookupFunction<>(ProfileRequestContext.class, "99", Integer.class);
         Assert.assertEquals(func.apply(null), 99);
-        
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunctionTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunctionTest.java
index dabb705..03e82e4 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunctionTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunctionTest.java
@@ -69,9 +69,8 @@ public class SpringStatusMessageLookupFunctionTest {
         public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
             if (code.equals("Mappable")) {
                 return "Mapped";
-            } else {
-                return defaultMessage;
             }
+            return defaultMessage;
         }
 
         /** {@inheritDoc} */
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/logic/ScriptedPredicateTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/logic/ScriptedPredicateTest.java
index 6218f8f..247880c 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/logic/ScriptedPredicateTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/logic/ScriptedPredicateTest.java
@@ -69,8 +69,7 @@ public class ScriptedPredicateTest {
     }
     @Test public void inlineBean() throws ScriptException {
 
-        GenericApplicationContext ctx = new GenericApplicationContext();
-        try {
+        try (final GenericApplicationContext ctx = new GenericApplicationContext()) {
             SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                     new SchemaTypeAwareXMLBeanDefinitionReader(ctx);
 
@@ -83,15 +82,12 @@ public class ScriptedPredicateTest {
             Assert.assertTrue(rule.test(withChild));
 
             Assert.assertFalse(rule.test(noChild));
-        } finally {
-            ctx.close();
         }
     }
 
     @Test public void resourceBean() throws ScriptException {
 
-        GenericApplicationContext ctx = new GenericApplicationContext();
-        try {
+        try (final GenericApplicationContext ctx = new GenericApplicationContext()) {
             SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                     new SchemaTypeAwareXMLBeanDefinitionReader(ctx);
 
@@ -104,8 +100,6 @@ public class ScriptedPredicateTest {
             Assert.assertTrue(rule.test(withChild));
 
             Assert.assertFalse(rule.test(noChild));
-        } finally {
-            ctx.close();
         }
     }
 
diff --git a/idp-profile-impl/.settings/org.eclipse.jdt.core.prefs b/idp-profile-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-profile-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-profile-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/AttributesAuditExtractor.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/AttributesAuditExtractor.java
index 82e6bc8..0bf04d1 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/AttributesAuditExtractor.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/AttributesAuditExtractor.java
@@ -94,9 +94,8 @@ public class AttributesAuditExtractor implements Function<ProfileRequestContext,
         if (attributeCtx != null) {
             return (useUnfiltered ? attributeCtx.getUnfilteredIdPAttributes()
                     : attributeCtx.getIdPAttributes()).keySet();
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContext.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContext.java
index 4f3f789..d0aa46f 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContext.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContext.java
@@ -253,10 +253,10 @@ public class PopulateAuditContext extends AbstractProfileAction {
             final Object values = entry.getValue().apply(profileRequestContext);
             if (values != null) {
                 if (values instanceof Collection) {
-                    if (!((Collection) values).isEmpty()) {
-                        log.trace("{} Adding {} value(s) for field '{}'", getLogPrefix(), ((Collection) values).size(),
-                                entry.getKey());
-                        for (final Object value : (Collection) values) {
+                    if (!((Collection<?>) values).isEmpty()) {
+                        log.trace("{} Adding {} value(s) for field '{}'", getLogPrefix(),
+                                ((Collection<?>) values).size(), entry.getKey());
+                        for (final Object value : (Collection<?>) values) {
                             addField(entry.getKey(), value);
                         }
                     }
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ProfileActionBeanPostProcessor.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ProfileActionBeanPostProcessor.java
index 23e3978..d3bcd5d 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ProfileActionBeanPostProcessor.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ProfileActionBeanPostProcessor.java
@@ -47,8 +47,7 @@ public class ProfileActionBeanPostProcessor implements BeanPostProcessor {
                         + beanName, e);
             }
             return wrapper;
-        } else {
-            return bean;
         }
+        return bean;
     }
 }
\ No newline at end of file
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ReloadServiceConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ReloadServiceConfiguration.java
index 12d5739..81bdcd5 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ReloadServiceConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ReloadServiceConfiguration.java
@@ -64,10 +64,10 @@ public class ReloadServiceConfiguration extends AbstractProfileAction {
     @Nonnull private Logger log = LoggerFactory.getLogger(ReloadServiceConfiguration.class);
     
     /** Lookup function to locate service bean to operate on. */
-    @Nonnull private Function<ProfileRequestContext,ReloadableService> serviceLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ReloadableService<?>> serviceLookupStrategy;
     
     /** The service to reload. */
-    @Nullable private ReloadableService service;
+    @Nullable private ReloadableService<?> service;
     
     /** Constructor. */
     public ReloadServiceConfiguration() {
@@ -79,7 +79,7 @@ public class ReloadServiceConfiguration extends AbstractProfileAction {
      * 
      * @param strategy  lookup strategy
      */
-    public void setServiceLookupStrategy(@Nonnull final Function<ProfileRequestContext,ReloadableService> strategy) {
+    public void setServiceLookupStrategy(@Nonnull final Function<ProfileRequestContext,ReloadableService<?>> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         serviceLookupStrategy = Constraint.isNotNull(strategy, "ReloadableService lookup strategy cannot be null");
@@ -144,11 +144,12 @@ public class ReloadServiceConfiguration extends AbstractProfileAction {
     /**
      * Default strategy locates a bean identified with a flow-scope parameter in the web flow application context.
      */
-    private class WebFlowApplicationContextLookupStrategy implements Function<ProfileRequestContext,ReloadableService> {
+    private class WebFlowApplicationContextLookupStrategy
+            implements Function<ProfileRequestContext,ReloadableService<?>> {
 
         /** {@inheritDoc} */
         @Override
-        @Nullable public ReloadableService apply(@Nullable final ProfileRequestContext input) {
+        @Nullable public ReloadableService<?> apply(@Nullable final ProfileRequestContext input) {
             
             final SpringRequestContext springRequestContext = input.getSubcontext(SpringRequestContext.class);
             if (springRequestContext == null) {
@@ -171,7 +172,7 @@ public class ReloadServiceConfiguration extends AbstractProfileAction {
             try {
                 final Object bean = requestContext.getActiveFlow().getApplicationContext().getBean(id);
                 if (bean != null && bean instanceof ReloadableService) {
-                    return (ReloadableService) bean;
+                    return (ReloadableService<?>) bean;
                 }
             } catch (final BeansException e) {
                 
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectProfileConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectProfileConfiguration.java
index 21a01db..82b95dc 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectProfileConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectProfileConfiguration.java
@@ -181,9 +181,8 @@ public class SelectProfileConfiguration extends AbstractMessageHandler {
             log.warn("{} Profile {} is not available for RP configuration {} (RPID {})",
                     new Object[] {getLogPrefix(), profileId, rpConfig.getId(), rpCtx.getRelyingPartyId(),});
             throw new MessageHandlerException("Profile is not available for RP configuration");
-        } else {
-            rpCtx.setProfileConfig(profileConfiguration);
         }
+        rpCtx.setProfileConfig(profileConfiguration);
     }
     
 }
\ No newline at end of file
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
index 36b9e88..f234236 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
@@ -104,9 +104,8 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
         final String entityID = resolveSingle(criteria);
         if (entityID != null) {
             return Collections.singletonList(entityID);
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
     }
 
     /** {@inheritDoc} */
@@ -120,10 +119,8 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
         final RelyingPartyConfiguration rpc = rpcResolver.resolveSingle(prcSet);
         if (rpc != null) {
             return rpc.getResponderId(prc);
-        } else {
-            return null;
-            
         }
+        return null;
     }
 
     /**
@@ -174,9 +171,8 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
                 metadataContext.setRoleDescriptor(roleDescriptor);
             }
             return prc;
-        } else {
-            return null;
         }
+        return null;
     }
 
     /**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
index b9ed1cf..9fcbb69 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
@@ -305,9 +305,8 @@ public class DefaultRelyingPartyConfigurationResolver
             if (configuration.test(context)) {
                 log.debug("Relying party configuration {} is applicable", configuration.getId());
                 return configuration;
-            } else {
-                log.debug("Relying party configuration {} is not applicable", configuration.getId());
             }
+            log.debug("Relying party configuration {} is not applicable", configuration.getId());
         }
 
         log.debug("No relying party configurations are applicable, returning the default configuration {}",
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
index 8ebdfe5..261f274 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
@@ -123,9 +123,8 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
         final Iterator<RelyingPartyConfiguration> results = resolve(criteria).iterator();
         if (results.hasNext()) {
             return results.next();
-        } else {
-            return null;
         }
+        return null;
     }
 
     /** {@inheritDoc} */
@@ -138,9 +137,8 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
         final ProfileRequestContext prc = buildContext(criteria);
         if (prc != null) {
             return delegate.resolve(prc);
-        } else {
-            return Collections.emptyList();
         }
+        return Collections.emptyList();
         
     }
 
@@ -192,9 +190,8 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
                 metadataContext.setRoleDescriptor(roleDescriptor);
             }
             return prc;
-        } else {
-            return null;
         }
+        return null;
     }
 
     /**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
index 2c50d45..322198e 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
@@ -77,9 +77,8 @@ public class EncryptionCredentialsResolver implements CredentialResolver, Identi
         final Iterable<Credential> creds = resolve(criteriaSet);
         if (creds.iterator().hasNext()) {
             return creds.iterator().next();
-        } else {
-            return null;
         }
+        return null;
     }
     
     /** {@inheritDoc} */
@@ -96,10 +95,9 @@ public class EncryptionCredentialsResolver implements CredentialResolver, Identi
                 if (resolver instanceof DefaultRelyingPartyConfigurationResolver) {
                     log.trace("Saw expected instance of DefaultRelyingPartyConfigurationResolver");
                     return ((DefaultRelyingPartyConfigurationResolver)resolver).getEncryptionCredentials();
-                } else {
-                    log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
-                    return Collections.emptyList();
                 }
+                log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
+                return Collections.emptyList();
             }
         } finally {
             if (null != component) {
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
index 956b250..0d18864 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
@@ -77,9 +77,8 @@ public class SigningCredentialsResolver implements CredentialResolver, Identifia
         final Iterable<Credential> creds = resolve(criteriaSet);
         if (creds.iterator().hasNext()) {
             return creds.iterator().next();
-        } else {
-            return null;
         }
+        return null;
     }
     
     /** {@inheritDoc} */
@@ -96,10 +95,9 @@ public class SigningCredentialsResolver implements CredentialResolver, Identifia
                 if (resolver instanceof DefaultRelyingPartyConfigurationResolver) {
                     log.trace("Saw expected instance of DefaultRelyingPartyConfigurationResolver");
                     return ((DefaultRelyingPartyConfigurationResolver)resolver).getSigningCredentials();
-                } else {
-                    log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
-                    return Collections.emptyList();
                 }
+                log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
+                return Collections.emptyList();
             }
         } finally {
             if (null != component) {
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/FilterAttributesTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/FilterAttributesTest.java
index 89c4ebc..2e2f7f3 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/FilterAttributesTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/FilterAttributesTest.java
@@ -67,7 +67,7 @@ public class FilterAttributesTest {
         final AttributeFilterImpl engine = new AttributeFilterImpl("test", null);
         engine.initialize();
 
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(engine));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(engine));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -83,7 +83,7 @@ public class FilterAttributesTest {
         final AttributeFilterImpl engine = new AttributeFilterImpl("test", null);
         engine.initialize();
         
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(engine));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(engine));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -126,7 +126,7 @@ public class FilterAttributesTest {
         attributeCtx.setIdPAttributes(attributes);
         prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attributeCtx);
 
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(engine));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(engine));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -188,7 +188,7 @@ public class FilterAttributesTest {
         final AttributeFilterContext attributeFilterCtx = new AttributeFilterContext();
         prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attributeFilterCtx);
 
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(engine));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(engine));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -247,7 +247,7 @@ public class FilterAttributesTest {
         final AttributeFilterContext attributeFilterCtx = new AttributeFilterContext();
         prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attributeFilterCtx);
 
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(engine));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(engine));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -270,7 +270,7 @@ public class FilterAttributesTest {
         final AttributeFilterContext attributeFilterCtx = new AttributeFilterContext();
         prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attributeFilterCtx);
 
-        final FilterAttributes action = new FilterAttributes(new MockReloadableService(null));
+        final FilterAttributes action = new FilterAttributes(new MockReloadableService<>(null));
         action.setMaskFailures(false);
         action.initialize();
 
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/ResolveAttributesTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/ResolveAttributesTest.java
index da718d0..d53cdbb 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/ResolveAttributesTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/ResolveAttributesTest.java
@@ -73,7 +73,7 @@ public class ResolveAttributesTest {
         ad1.initialize();
         resolver.initialize();
 
-        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService(resolver));
+        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService<>(resolver));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -111,7 +111,7 @@ public class ResolveAttributesTest {
         attributeResolutionCtx.setRequestedIdPAttributeNames(Collections.singleton("ad1"));
         prc.addSubcontext(attributeResolutionCtx);
 
-        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService(resolver));
+        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService<>(resolver));
         action.initialize();
 
         Event event = action.execute(src);
@@ -166,7 +166,7 @@ public class ResolveAttributesTest {
         ad1.initialize();
         resolver.initialize();
 
-        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService(resolver));
+        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService<>(resolver));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -186,7 +186,7 @@ public class ResolveAttributesTest {
         final LazySet<AttributeDefinition> definitions = new LazySet<>();
         definitions.add(new MockAttributeDefinition("ad1", new ResolutionException()));
 
-        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService(null));
+        final ResolveAttributes action = new ResolveAttributes(new MockReloadableService<>(null));
         action.setMaskFailures(false);
         action.initialize();
 
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/WriteProfileInterceptorResultToStorageTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/WriteProfileInterceptorResultToStorageTest.java
index cc92b0f..768f1f1 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/WriteProfileInterceptorResultToStorageTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/WriteProfileInterceptorResultToStorageTest.java
@@ -101,7 +101,7 @@ public class WriteProfileInterceptorResultToStorageTest {
 
         ActionTestingSupport.assertProceedEvent(event);
 
-        final StorageRecord storageRecord = ss.read("context", "key");
+        final StorageRecord<?> storageRecord = ss.read("context", "key");
         Assert.assertNotNull(storageRecord);
         Assert.assertEquals(storageRecord.getValue(), "value");
         Assert.assertEquals(storageRecord.getExpiration(), null);
@@ -117,7 +117,7 @@ public class WriteProfileInterceptorResultToStorageTest {
 
         ActionTestingSupport.assertProceedEvent(event);
 
-        final StorageRecord storageRecord = ss.read("context", "key");
+        final StorageRecord<?> storageRecord = ss.read("context", "key");
         Assert.assertNotNull(storageRecord);
         Assert.assertEquals(storageRecord.getValue(), "value");
         Assert.assertEquals(storageRecord.getExpiration(), Long.valueOf(expiration.toEpochMilli()));
@@ -132,7 +132,7 @@ public class WriteProfileInterceptorResultToStorageTest {
 
         ActionTestingSupport.assertProceedEvent(event);
 
-        StorageRecord storageRecord = ss.read("context", "key");
+        StorageRecord<?> storageRecord = ss.read("context", "key");
         Assert.assertNotNull(storageRecord);
         Assert.assertEquals(storageRecord.getValue(), "value");
         Assert.assertEquals(storageRecord.getExpiration(), null);
diff --git a/idp-profile-spring/.settings/org.eclipse.jdt.core.prefs b/idp-profile-spring/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-profile-spring/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-profile-spring/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
index c2ef6b9..d6860c1 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionRegistryFactoryBean.java
@@ -110,7 +110,7 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
     public void setFlowLocations(@Nonnull @NonnullElements final Map<String,String> locationMap) {
         Constraint.isNotNull(locationMap, "Flow mappings cannot be null");
         
-        flowLocations = new LinkedHashMap(locationMap.size());
+        flowLocations = new LinkedHashMap<>(locationMap.size());
         for (final Map.Entry<String,String> entry : locationMap.entrySet()) {
             if (entry.getKey() != null && entry.getValue() != null) {
                 flowLocations.put(entry.getKey(), entry.getValue());
@@ -128,7 +128,7 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
     public void setFlowLocationPatterns(@Nonnull final Map<String,String> patternMap) {
         Constraint.isNotNull(patternMap, "Pattern mappings cannot be null");
         
-        flowLocationPatterns = new LinkedHashMap(patternMap.size());
+        flowLocationPatterns = new LinkedHashMap<>(patternMap.size());
         for (final Map.Entry<String,String> entry : patternMap.entrySet()) {
             if (entry.getKey() != null && (basePath != null || entry.getValue() != null)) {
                 flowLocationPatterns.put(entry.getKey(), entry.getValue());
@@ -182,7 +182,7 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
      */
     private void registerFlowLocations(@Nonnull final DefaultFlowRegistry flowRegistry) {
         for (final Map.Entry<String,String> location : flowLocations.entrySet()) {
-            final LocalAttributeMap<Object> attributes = new LocalAttributeMap<Object>();
+            final LocalAttributeMap<Object> attributes = new LocalAttributeMap<>();
             updateFlowAttributes(attributes);
             final FlowDefinitionResource resource =
                     flowResourceFactory.createResource(basePath, location.getValue(), attributes, location.getKey());
@@ -197,7 +197,7 @@ public class FlowDefinitionRegistryFactoryBean extends AbstractFactoryBean<FlowD
      */
     private void registerFlowLocationPatterns(@Nonnull final DefaultFlowRegistry flowRegistry) {
         for (final Map.Entry<String,String> pattern : flowLocationPatterns.entrySet()) {
-            final LocalAttributeMap<Object> attributes = new LocalAttributeMap<Object>();
+            final LocalAttributeMap<Object> attributes = new LocalAttributeMap<>();
             updateFlowAttributes(attributes);
             final Collection<FlowDefinitionResource> resources;
             try {
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
index 87e78f1..5ba5bba 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
@@ -222,9 +222,8 @@ public class FlowDefinitionResourceFactory {
         final int basePathIndex = filePath.lastIndexOf(basePath);
         if (basePathIndex != -1) {
             return filePath.substring(basePathIndex);
-        } else {
-            return filePath;
         }
+        return filePath;
     }
 
     /**
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/StaticPKIXFactoryBean.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/StaticPKIXFactoryBean.java
index 75d2830..9c4a933 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/StaticPKIXFactoryBean.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/StaticPKIXFactoryBean.java
@@ -197,9 +197,8 @@ public class StaticPKIXFactoryBean extends AbstractComponentAwareFactoryBean<PKI
         
         if (checkNames) {
             return new PKIXX509CredentialTrustEngine(resolver);
-        } else {
-            return new PKIXX509CredentialTrustEngine(resolver, null);
         }
+        return new PKIXX509CredentialTrustEngine(resolver, null);
     }
     
 }
\ No newline at end of file
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ScriptTypeBeanParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ScriptTypeBeanParser.java
index 893bebe..12139d3 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ScriptTypeBeanParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ScriptTypeBeanParser.java
@@ -51,7 +51,7 @@ public final class ScriptTypeBeanParser {
      * 
      * @return bean definition builder
      */
-    @Nonnull public static BeanDefinitionBuilder parseScriptType(@Nonnull final Class type,
+    @Nonnull public static BeanDefinitionBuilder parseScriptType(@Nonnull final Class<?> type,
             @Nonnull final Element element) {
         
         final BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(type);
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/TLSSocketFactoryFactoryBean.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/TLSSocketFactoryFactoryBean.java
index d8f11a3..7c86689 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/TLSSocketFactoryFactoryBean.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/TLSSocketFactoryFactoryBean.java
@@ -32,7 +32,7 @@ import net.shibboleth.utilities.java.support.httpclient.HttpClientSupport;
 /**
  * A factory bean for producing instances of {@link LayeredConnectionSocketFactory} for use in {@link HttpClient}.
  */
-public class TLSSocketFactoryFactoryBean extends AbstractFactoryBean {
+public class TLSSocketFactoryFactoryBean extends AbstractFactoryBean<LayeredConnectionSocketFactory> {
     
     /** The optional trust engine used in evaluating server TLS credentials. */
     private TrustEngine<?> tlsTrustEngine;
@@ -72,12 +72,12 @@ public class TLSSocketFactoryFactoryBean extends AbstractFactoryBean {
 
 
     /** {@inheritDoc} */
-    @Override public Class getObjectType() {
+    @Override public Class<LayeredConnectionSocketFactory> getObjectType() {
         return LayeredConnectionSocketFactory.class;
     }
 
     /** {@inheritDoc} */
-    @Override protected Object createInstance() throws Exception {
+    @Override protected LayeredConnectionSocketFactory createInstance() throws Exception {
         final boolean haveTrustEngine = tlsTrustEngine != null 
                 || (httpClientSecurityParameters != null && httpClientSecurityParameters.getTLSTrustEngine() != null);
         final boolean haveClientTLSCred = 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/AlgorithmFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/AlgorithmFilterParser.java
index 8a0e275..cf707ee 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/AlgorithmFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/AlgorithmFilterParser.java
@@ -83,7 +83,7 @@ public class AlgorithmFilterParser extends AbstractSingleBeanDefinitionParser {
         // Accumulate objects to attach as rule values.
         final List<XMLObject> accumulator = new ArrayList<>();
 
-        final ManagedMap<Object, ManagedList<XMLObject>> ruleMap = new ManagedMap();
+        final ManagedMap<Object, ManagedList<XMLObject>> ruleMap = new ManagedMap<>();
 
         Element child = ElementSupport.getFirstChildElement(element);
 
@@ -111,17 +111,17 @@ public class AlgorithmFilterParser extends AbstractSingleBeanDefinitionParser {
                 final BeanDefinitionBuilder entityIdBuilder =
                         BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
                 entityIdBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
-                final ManagedList<XMLObject> forRule = new ManagedList(accumulator.size());
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionRef")) {
-                final ManagedList<XMLObject> forRule = new ManagedList(accumulator.size());
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(new RuntimeBeanReference(ElementSupport.getElementContentAsString(child)), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionScript")) {
-                final ManagedList<XMLObject> forRule = new ManagedList(accumulator.size());
+                final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
                         forRule);
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityAttributesFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityAttributesFilterParser.java
index ed1f3dc..db6d97a 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityAttributesFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityAttributesFilterParser.java
@@ -74,7 +74,7 @@ public class EntityAttributesFilterParser extends AbstractSingleBeanDefinitionPa
         // Accumulate Attribute objects to attach as rule values.
         final List<Attribute> accumulator = new ArrayList<>();
 
-        final ManagedMap<Object, ManagedList<Attribute>> ruleMap = new ManagedMap();
+        final ManagedMap<Object, ManagedList<Attribute>> ruleMap = new ManagedMap<>();
 
         Element child = ElementSupport.getFirstChildElement(element);
         
@@ -105,17 +105,17 @@ public class EntityAttributesFilterParser extends AbstractSingleBeanDefinitionPa
                 final BeanDefinitionBuilder entityIdBuilder =
                         BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
                 entityIdBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
-                final ManagedList<Attribute> forRule = new ManagedList(accumulator.size());
+                final ManagedList<Attribute> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionRef")) {
-                final ManagedList<Attribute> forRule = new ManagedList(accumulator.size());
+                final ManagedList<Attribute> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(new RuntimeBeanReference(ElementSupport.getElementContentAsString(child)), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionScript")) {
-                final ManagedList<Attribute> forRule = new ManagedList(accumulator.size());
+                final ManagedList<Attribute> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
                         forRule);
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityRoleFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityRoleFilterParser.java
index 1216b85..d7703dd 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityRoleFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/EntityRoleFilterParser.java
@@ -25,7 +25,6 @@ import javax.xml.namespace.QName;
 
 import net.shibboleth.ext.spring.util.SpringSupport;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataProviderParser;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.ElementSupport;
 
 import org.opensaml.saml.metadata.resolver.filter.impl.EntityRoleFilter;
@@ -64,12 +63,14 @@ public class EntityRoleFilterParser extends AbstractSingleBeanDefinitionParser {
 
         if (element.hasAttributeNS(null, "removeRolelessEntityDescriptors")) {
             builder.addPropertyValue("removeRolelessEntityDescriptors",
-                    SpringSupport.getStringValueAsBoolean(element.getAttributeNS(null, "removeRolelessEntityDescriptors")));
+                    SpringSupport.getStringValueAsBoolean(
+                            element.getAttributeNS(null, "removeRolelessEntityDescriptors")));
         }
 
         if (element.hasAttributeNS(null, "removeEmptyEntitiesDescriptors")) {
             builder.addPropertyValue("removeEmptyEntitiesDescriptors",
-                    SpringSupport.getStringValueAsBoolean(element.getAttributeNS(null, "removeEmptyEntitiesDescriptors")));
+                    SpringSupport.getStringValueAsBoolean(
+                            element.getAttributeNS(null, "removeEmptyEntitiesDescriptors")));
         }
     }
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/NameIDFormatFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/NameIDFormatFilterParser.java
index a7891e6..ef64138 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/NameIDFormatFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/NameIDFormatFilterParser.java
@@ -72,7 +72,7 @@ public class NameIDFormatFilterParser extends AbstractSingleBeanDefinitionParser
         // Accumulate formats to attach as rule values.
         final List<String> accumulator = new ArrayList<>();
 
-        final ManagedMap<Object, ManagedList<String>> ruleMap = new ManagedMap();
+        final ManagedMap<Object, ManagedList<String>> ruleMap = new ManagedMap<>();
 
         Element child = ElementSupport.getFirstChildElement(element);
         while (child != null) {
@@ -83,17 +83,17 @@ public class NameIDFormatFilterParser extends AbstractSingleBeanDefinitionParser
                 final BeanDefinitionBuilder entityIdBuilder =
                         BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
                 entityIdBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
-                final ManagedList<String> forRule = new ManagedList(accumulator.size());
+                final ManagedList<String> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
             } else if (ElementSupport.isElementNamed(child,
                     AbstractMetadataProviderParser.METADATA_NAMESPACE, "ConditionRef")) {
-                final ManagedList<String> forRule = new ManagedList(accumulator.size());
+                final ManagedList<String> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(new RuntimeBeanReference(ElementSupport.getElementContentAsString(child)), forRule);
             } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
                     "ConditionScript")) {
-                final ManagedList<String> forRule = new ManagedList(accumulator.size());
+                final ManagedList<String> forRule = new ManagedList<>(accumulator.size());
                 forRule.addAll(accumulator);
                 ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
                         forRule);
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/SignatureValidationParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/SignatureValidationParser.java
index 92aaf0d..1a28a0c 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/SignatureValidationParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/SignatureValidationParser.java
@@ -65,7 +65,7 @@ public class SignatureValidationParser extends AbstractSingleBeanDefinitionParse
     @Nonnull private final Logger log = LoggerFactory.getLogger(SignatureValidationParser.class);
 
     /** {@inheritDoc} */
-    @Override protected Class getBeanClass(final Element element) {
+    @Override protected Class<?> getBeanClass(final Element element) {
         return SignatureValidationFilter.class;
     }
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicHTTPMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicHTTPMetadataProviderParser.java
index a63ebcb..0e3dcd0 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicHTTPMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicHTTPMetadataProviderParser.java
@@ -39,7 +39,7 @@ import net.shibboleth.utilities.java.support.xml.XMLConstants;
 public abstract class AbstractDynamicHTTPMetadataProviderParser extends AbstractDynamicMetadataProviderParser {
 
     /** Default caching type . */
-    private static final Class DEFAULT_CACHING_CLASS = InMemoryCachingHttpClientFactoryBean.class;
+    private static final Class<?> DEFAULT_CACHING_CLASS = InMemoryCachingHttpClientFactoryBean.class;
 
     /** Default max total connections. */
     private static final Integer DEFAULT_MAX_CONNECTIONS_TOTAL = 100;
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicMetadataProviderParser.java
index de7580c..85171ac 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractDynamicMetadataProviderParser.java
@@ -183,9 +183,8 @@ public abstract class AbstractDynamicMetadataProviderParser extends AbstractMeta
 
         if (element.hasAttributeNS(null, "taskTimerRef")) {
             return StringSupport.trimOrNull(StringSupport.trimOrNull(element.getAttributeNS(null, "taskTimerRef")));
-        } else {
-            return null;
         }
+        return null;
     }
 
     /**
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractReloadingMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractReloadingMetadataProviderParser.java
index 2598cf9..a3384d9 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractReloadingMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/AbstractReloadingMetadataProviderParser.java
@@ -95,9 +95,8 @@ public abstract class AbstractReloadingMetadataProviderParser extends AbstractMe
     protected String getTaskTimerRef(final Element element) {
         if (element.hasAttributeNS(null, "taskTimerRef")) {
             return StringSupport.trimOrNull(element.getAttributeNS(null, "taskTimerRef"));
-        } else {
-            return null;
         }
+        return null;
     }
 
     /**
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/HTTPMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/HTTPMetadataProviderParser.java
index e7ce3b6..6c8f01d 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/HTTPMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/HTTPMetadataProviderParser.java
@@ -37,7 +37,7 @@ import net.shibboleth.utilities.java.support.xml.ElementSupport;
 public abstract class HTTPMetadataProviderParser extends AbstractReloadingMetadataProviderParser {
 
     /** Default caching type. */
-    private static final Class DEFAULT_CACHING_CLASS = HttpClientFactoryBean.class;
+    private static final Class<?> DEFAULT_CACHING_CLASS = HttpClientFactoryBean.class;
 
     /** Logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(HTTPMetadataProviderParser.class);
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/AbstractStaticPKIXParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/AbstractStaticPKIXParser.java
index 544b5a2..c6567fe 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/AbstractStaticPKIXParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/AbstractStaticPKIXParser.java
@@ -147,9 +147,8 @@ public abstract class AbstractStaticPKIXParser extends AbstractTrustEngineParser
         @Override protected BasicX509CredentialNameEvaluator createInstance() throws Exception {
             if (trustedNameCheckEnabled) {
                 return new BasicX509CredentialNameEvaluator();
-            } else {
-                return null;
             }
+            return null;
         }
     }
 }
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/CertPathPKIXValidationOptionsParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/CertPathPKIXValidationOptionsParser.java
index c9b303f..2125222 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/CertPathPKIXValidationOptionsParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/CertPathPKIXValidationOptionsParser.java
@@ -45,7 +45,7 @@ public class CertPathPKIXValidationOptionsParser extends PKIXValidationOptionsPa
             "PolicyOID");
 
     /** {@inheritDoc} */
-    @Override protected Class getBeanClass(final Element element) {
+    @Override protected Class<?> getBeanClass(final Element element) {
         return CertPathPKIXValidationOptions.class;
     }
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/ChainingTrustEngineFactory.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/ChainingTrustEngineFactory.java
index baad3a0..ae69956 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/ChainingTrustEngineFactory.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/impl/ChainingTrustEngineFactory.java
@@ -34,7 +34,7 @@ import org.opensaml.security.trust.impl.ChainingTrustEngine;
  * unsupported engines out. A warning has been issued at point of parse so no further logging is required.
  */
 public class ChainingTrustEngineFactory extends
-        AbstractComponentAwareFactoryBean<ChainingTrustEngine> {
+        AbstractComponentAwareFactoryBean<ChainingTrustEngine<?>> {
 
     /** The unfiltered list of putative trust engines. */
     private final List<Object> engines;
@@ -54,16 +54,16 @@ public class ChainingTrustEngineFactory extends
     }
 
     /** {@inheritDoc} */
-    @Override protected ChainingTrustEngine doCreateInstance() throws Exception {
-        final List<TrustEngine> list = new ArrayList<>(engines.size());
+    @Override protected ChainingTrustEngine<?> doCreateInstance() throws Exception {
+        final List<TrustEngine<?>> list = new ArrayList<>(engines.size());
 
         for (final Object engine : engines) {
             if (engine instanceof TrustEngine) {
-                list.add((TrustEngine) engine);
+                list.add((TrustEngine<?>) engine);
 
             }
         }
         return new ChainingTrustEngine(list);
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/RelyingPartyIdPredicateTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/RelyingPartyIdPredicateTest.java
index 0a2e457..a7749e0 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/RelyingPartyIdPredicateTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/RelyingPartyIdPredicateTest.java
@@ -42,8 +42,7 @@ public class RelyingPartyIdPredicateTest {
     
     @Test
     public void constructors() {
-        GenericApplicationContext context = new FilesystemGenericApplicationContext();
-        try {
+        try (final GenericApplicationContext context = new FilesystemGenericApplicationContext()) {
             context.setDisplayName("ApplicationContext: Matcher");
             SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                     new SchemaTypeAwareXMLBeanDefinitionReader(context);
@@ -81,9 +80,7 @@ public class RelyingPartyIdPredicateTest {
             Assert.assertTrue(testCandidate(bean, "Single"));
             Assert.assertTrue(testCandidate(bean, "Double"));
             Assert.assertTrue(testCandidate(bean, "Elephant"));
-        } finally {
-            context.close();
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
index e286ebd..7ef9f3d 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/AbstractMetadataParserTest.java
@@ -107,7 +107,7 @@ public class AbstractMetadataParserTest extends OpenSAMLInitBaseTestCase {
         }
     }
     
-    protected ApplicationContext getApplicationContext(final String contextName, final PropertySource propSource, final String... files)
+    protected ApplicationContext getApplicationContext(final String contextName, final PropertySource<?> propSource, final String... files)
             throws IOException {
         final Resource[] resources = new Resource[files.length];
 
@@ -141,7 +141,7 @@ public class AbstractMetadataParserTest extends OpenSAMLInitBaseTestCase {
         return getApplicationContext(contextName, null, files);
     }
 
-    protected <T> T getBean(final Class<T> claz, final PropertySource propSource, final String... files) throws IOException {
+    protected <T> T getBean(final Class<T> claz, final PropertySource<?> propSource, final String... files) throws IOException {
         final ApplicationContext context = getApplicationContext(claz.getCanonicalName(), propSource, files);
 
         if (context.containsBean("shibboleth.ParserPool")) {
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/AbstractSecurityParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/AbstractSecurityParserTest.java
index 1602467..9c004c4 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/AbstractSecurityParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/AbstractSecurityParserTest.java
@@ -89,8 +89,7 @@ public class AbstractSecurityParserTest {
         
         if (name != null) {
             return context.getBean(name, claz);
-        } else {
-            return context.getBean(claz);
         }
+        return context.getBean(claz);
     }
 }
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/ChainingTrustEngineTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/ChainingTrustEngineTest.java
index 1dc9be6..85c9aa9 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/ChainingTrustEngineTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/ChainingTrustEngineTest.java
@@ -28,20 +28,20 @@ import org.testng.annotations.Test;
 
 public class ChainingTrustEngineTest extends AbstractSecurityParserTest {
     
-    private ChainingTrustEngine lookup(String file) throws IOException {
+    private ChainingTrustEngine<?> lookup(String file) throws IOException {
         return getBean(ChainingTrustEngine.class, "trustengine/" + file);
     }
 
     
     @Test public void one() throws IOException, SecurityException {
-        final ChainingTrustEngine engine = lookup("chainingTrue.xml");
+        final ChainingTrustEngine<?> engine = lookup("chainingTrue.xml");
         
         Assert.assertEquals(engine.getChain().size(), 1);
         Assert.assertTrue(engine.validate(null, null));
     }
 
     @Test public void two() throws IOException, SecurityException {
-        final ChainingTrustEngine engine = lookup("chainingTrueFalse.xml");
+        final ChainingTrustEngine<?> engine = lookup("chainingTrueFalse.xml");
         
         Assert.assertEquals(engine.getChain().size(), 2);
         Assert.assertTrue(engine.validate(null, null));
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/MockTrustEngine.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/MockTrustEngine.java
index cb9efc6..ed3d12e 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/MockTrustEngine.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/MockTrustEngine.java
@@ -25,7 +25,7 @@ import org.opensaml.security.trust.TrustEngine;
 /**
  *
  */
-public class MockTrustEngine implements TrustEngine {
+public class MockTrustEngine<T> implements TrustEngine<T> {
 
     private final boolean result;
     
@@ -38,8 +38,8 @@ public class MockTrustEngine implements TrustEngine {
     }
     
     /** {@inheritDoc} */
-    @Override public boolean validate(Object token, CriteriaSet trustBasisCriteria) throws SecurityException {
+    @Override public boolean validate(T token, CriteriaSet trustBasisCriteria) throws SecurityException {
         return result;
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/SignatureChainingParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/SignatureChainingParserTest.java
index 0ff274c..d7324b2 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/SignatureChainingParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/SignatureChainingParserTest.java
@@ -40,7 +40,7 @@ public class SignatureChainingParserTest extends AbstractSecurityParserTest {
         
         Assert.assertEquals(chain.getChain().size(),2);
         
-        final TrustedCredentialTrustEngine engine = (TrustedCredentialTrustEngine) chain.getChain().get(1);
+        final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) chain.getChain().get(1);
         
         final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
         
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeyFactoryBeanTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeyFactoryBeanTest.java
index aee7fbf..9a2e400 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeyFactoryBeanTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeyFactoryBeanTest.java
@@ -43,7 +43,7 @@ public class StaticExplicitKeyFactoryBeanTest extends AbstractSecurityParserTest
         final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticKeySingle", TrustEngine.class, TESTPATH);
         
         final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
-        Credential credential  = (Credential) resolver.resolveSingle(null);
+        Credential credential  = resolver.resolveSingle(null);
         
         Assert.assertNotNull(credential.getPublicKey());
     }
@@ -84,7 +84,7 @@ public class StaticExplicitKeyFactoryBeanTest extends AbstractSecurityParserTest
         Iterator<Credential> credentials = resolver.resolve(null).iterator();
         
         Assert.assertTrue(credentials.hasNext());
-        final Credential first = (Credential) credentials.next();
+        final Credential first = credentials.next();
         Assert.assertNotNull(first.getPublicKey());
         Assert.assertFalse(first instanceof X509Credential);
 
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeySignatureParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeySignatureParserTest.java
index e7312de..33e4b90 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeySignatureParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/security/trustengine/StaticExplicitKeySignatureParserTest.java
@@ -36,7 +36,7 @@ import org.testng.annotations.Test;
 public class StaticExplicitKeySignatureParserTest extends AbstractSecurityParserTest {
  
     @Test public void simple() throws IOException, ResolverException {
-        final TrustedCredentialTrustEngine engine = (TrustedCredentialTrustEngine) getBean(TrustEngine.class, "trustengine/staticExplicitSignature.xml");
+        final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) getBean(TrustEngine.class, "trustengine/staticExplicitSignature.xml");
         
         final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
         
diff --git a/idp-saml-api/.settings/org.eclipse.jdt.core.prefs b/idp-saml-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-saml-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-saml-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
index d299388..2176a58 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/SAMLEncoderSupport.java
@@ -73,20 +73,20 @@ public final class SAMLEncoderSupport {
         LOG.debug("Encoding value {} of attribute {}", value, attribute.getId());
         
         if (withType) {
-            final XMLObjectBuilder<XSString> stringBuilder = (XMLObjectBuilder<XSString>)
+            final XMLObjectBuilder<XSString> stringBuilder =
                     XMLObjectProviderRegistrySupport.getBuilderFactory().<XSString>getBuilderOrThrow(
                             XSString.TYPE_NAME);
             final XSString samlAttributeValue =
                     stringBuilder.buildObject(attributeValueElementName, XSString.TYPE_NAME);
             samlAttributeValue.setValue(value);
             return samlAttributeValue;
-        } else {
-            final XMLObjectBuilder<XSAny> anyBuilder = (XMLObjectBuilder<XSAny>)
-                    XMLObjectProviderRegistrySupport.getBuilderFactory().<XSAny>getBuilderOrThrow(XSAny.TYPE_NAME);
-            final XSAny samlAttributeValue = anyBuilder.buildObject(attributeValueElementName);
-            samlAttributeValue.setTextContent(value);
-            return samlAttributeValue;
         }
+        
+        final XMLObjectBuilder<XSAny> anyBuilder =
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<XSAny>getBuilderOrThrow(XSAny.TYPE_NAME);
+        final XSAny samlAttributeValue = anyBuilder.buildObject(attributeValueElementName);
+        samlAttributeValue.setTextContent(value);
+        return samlAttributeValue;
     }
 
     /**
@@ -110,20 +110,19 @@ public final class SAMLEncoderSupport {
         }
 
         if (withType) {
-            final XMLObjectBuilder<XSBase64Binary> binaryBuilder = (XMLObjectBuilder<XSBase64Binary>)
+            final XMLObjectBuilder<XSBase64Binary> binaryBuilder =
                     XMLObjectProviderRegistrySupport.getBuilderFactory().<XSBase64Binary>getBuilderOrThrow(
                             XSBase64Binary.TYPE_NAME);
             final XSBase64Binary samlAttributeValue =
                     binaryBuilder.buildObject(attributeValueElementName, XSBase64Binary.TYPE_NAME);
             samlAttributeValue.setValue(Base64Support.encode(value, Base64Support.UNCHUNKED));
             return samlAttributeValue;
-        } else {
-            final XMLObjectBuilder<XSAny> anyBuilder = (XMLObjectBuilder<XSAny>)
-                    XMLObjectProviderRegistrySupport.getBuilderFactory().<XSAny>getBuilderOrThrow(XSAny.TYPE_NAME);
-            final XSAny samlAttributeValue = anyBuilder.buildObject(attributeValueElementName);
-            samlAttributeValue.setTextContent(Base64Support.encode(value, Base64Support.UNCHUNKED));
-            return samlAttributeValue;
         }
+        final XMLObjectBuilder<XSAny> anyBuilder =
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<XSAny>getBuilderOrThrow(XSAny.TYPE_NAME);
+        final XSAny samlAttributeValue = anyBuilder.buildObject(attributeValueElementName);
+        samlAttributeValue.setTextContent(Base64Support.encode(value, Base64Support.UNCHUNKED));
+        return samlAttributeValue;
     }
 
     /**
@@ -144,8 +143,8 @@ public final class SAMLEncoderSupport {
         Constraint.isNotNull(attribute, "Attribute cannot be null");
         Constraint.isNotNull(attributeValueElementName, "Attribute Element Name cannot be null");
 
-        final XMLObjectBuilder<XSAny> attributeValueBuilder = (XMLObjectBuilder<XSAny>)
-                XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(XSAny.TYPE_NAME);
+        final XMLObjectBuilder<XSAny> attributeValueBuilder =
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<XSAny>getBuilderOrThrow(XSAny.TYPE_NAME);
         final XSAny samlAttributeValue = attributeValueBuilder.buildObject(attributeValueElementName);
         samlAttributeValue.getUnknownXMLObjects().add(value);
 
@@ -176,8 +175,9 @@ public final class SAMLEncoderSupport {
             return null;
         }
         
-        final XMLObjectBuilder<ScopedValue> scopedValueBuilder = (XMLObjectBuilder<ScopedValue>)
-                XMLObjectProviderRegistrySupport.getBuilderFactory().getBuilder(ScopedValue.TYPE_NAME);
+        final XMLObjectBuilder<ScopedValue> scopedValueBuilder =
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<ScopedValue>getBuilderOrThrow(
+                        ScopedValue.TYPE_NAME);
         final ScopedValue scopedValue =
                 withType ? scopedValueBuilder.buildObject(attributeValueElementName, ScopedValue.TYPE_NAME)
                         : scopedValueBuilder.buildObject(attributeValueElementName);
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java
index ffa9f90..d061764 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/metadata/RelyingPartyMetadataProvider.java
@@ -195,9 +195,8 @@ public class RelyingPartyMetadataProvider extends AbstractServiceableComponent<M
     public Instant getLastRefresh() {
         if (resolver instanceof RefreshableMetadataResolver) {
             return ((RefreshableMetadataResolver) resolver).getLastRefresh();
-        } else {
-            return null;
         }
+        return null;
     }
 
     /** {@inheritDoc} */
@@ -205,27 +204,24 @@ public class RelyingPartyMetadataProvider extends AbstractServiceableComponent<M
     public Instant getLastUpdate() {
         if (resolver instanceof RefreshableMetadataResolver) {
             return ((RefreshableMetadataResolver) resolver).getLastUpdate();
-        } else {
-            return null;
         }
+        return null;
     }
     
     /** {@inheritDoc} */
     public Instant getLastSuccessfulRefresh() {
         if (resolver instanceof RefreshableMetadataResolver) {
             return ((RefreshableMetadataResolver) resolver).getLastSuccessfulRefresh();
-        } else {
-            return null;
         }
+        return null;
     }
 
     /** {@inheritDoc} */
     public Boolean wasLastRefreshSuccess() {
         if (resolver instanceof RefreshableMetadataResolver) {
             return ((RefreshableMetadataResolver) resolver).wasLastRefreshSuccess();
-        } else {
-            return null;
         }
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIDCanonicalizationFlowDescriptor.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIDCanonicalizationFlowDescriptor.java
index 39d1021..51d7dd8 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIDCanonicalizationFlowDescriptor.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIDCanonicalizationFlowDescriptor.java
@@ -63,7 +63,7 @@ public class NameIDCanonicalizationFlowDescriptor extends SubjectCanonicalizatio
     public void setFormats(@Nonnull final Collection<String> theFormats) {
         Constraint.isNotNull(theFormats, "Format collection cannot be null");
         
-        formats = new HashSet(theFormats.size());
+        formats = new HashSet<>(theFormats.size());
         CollectionSupport.addIf(formats, theFormats, Predicates.notNull());
     }
     
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractMetadataDrivenConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
index 6a15fb7..4ee321e 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
@@ -475,7 +475,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
      * 
      * @return matching attribute, or null
      */
-    @Nullable private IdPAttribute findMatchingMappedTag(@Nonnull final LockableClassToInstanceMultiMap input,
+    @Nullable private IdPAttribute findMatchingMappedTag(@Nonnull final LockableClassToInstanceMultiMap<?> input,
             @Nonnull @NotEmpty final String name) {
 
         final List<AttributesMapContainer> containerList = input.get(AttributesMapContainer.class);
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BeanConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BeanConfigurationLookupStrategy.java
index 31bdbb4..3e71e8a 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BeanConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BeanConfigurationLookupStrategy.java
@@ -116,10 +116,9 @@ public class BeanConfigurationLookupStrategy<T> extends AbstractMetadataDrivenCo
                         ((StringAttributeValue) value).getValue(), e);
                 return null;
             }
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BooleanConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BooleanConfigurationLookupStrategy.java
index c0e3f2b..dc3ef4c 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BooleanConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/BooleanConfigurationLookupStrategy.java
@@ -62,10 +62,9 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return XSBooleanValue.valueOf(((StringAttributeValue) value).getValue()).getValue();
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
@@ -95,9 +94,8 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
             final String value = ((XSString) object).getValue();
             if (value != null) {
                 return XSBooleanValue.valueOf(value).getValue();
-            } else {
-                return null;
             }
+            return null;
         } else if (object instanceof XSBoolean) {
             final XSBooleanValue value = ((XSBoolean) object).getValue();
             return value != null ? value.getValue() : null;
@@ -110,9 +108,8 @@ public class BooleanConfigurationLookupStrategy extends AbstractMetadataDrivenCo
                 final String value = wc.getTextContent();
                 if (value != null) {
                     return XSBooleanValue.valueOf(value).getValue();
-                } else {
-                    return null;
                 }
+                return null;
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DoubleConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DoubleConfigurationLookupStrategy.java
index 563a67f..3a5fbb6 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DoubleConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DoubleConfigurationLookupStrategy.java
@@ -62,10 +62,9 @@ public class DoubleConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return Double.valueOf(((StringAttributeValue) value).getValue());
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DurationConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DurationConfigurationLookupStrategy.java
index a08213a..4d176e7 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DurationConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/DurationConfigurationLookupStrategy.java
@@ -76,10 +76,9 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
                 log.error("Error converting duration", e);
                 return null;
             }
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
@@ -114,9 +113,8 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
                     log.error("Error converting duration", e);
                     return null;
                 }
-            } else {
-                return null;
             }
+            return null;
         } else if (object instanceof XSInteger) {
             final Integer value = ((XSInteger) object).getValue();
             return value != null ? Duration.ofMillis(value.longValue()) : null;
@@ -131,9 +129,8 @@ public class DurationConfigurationLookupStrategy extends AbstractMetadataDrivenC
                         log.error("Error converting duration", e);
                         return null;
                     }
-                } else {
-                    return null;
                 }
+                return null;
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/IntegerConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/IntegerConfigurationLookupStrategy.java
index a10274d..abe41a2 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/IntegerConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/IntegerConfigurationLookupStrategy.java
@@ -62,10 +62,9 @@ public class IntegerConfigurationLookupStrategy extends AbstractMetadataDrivenCo
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return Integer.decode(((StringAttributeValue) value).getValue());
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/LongConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/LongConfigurationLookupStrategy.java
index 9468b7a..156056d 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/LongConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/LongConfigurationLookupStrategy.java
@@ -64,10 +64,9 @@ public class LongConfigurationLookupStrategy extends AbstractMetadataDrivenConfi
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return Long.decode(((StringAttributeValue) value).getValue());
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/StringConfigurationLookupStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/StringConfigurationLookupStrategy.java
index 6613d51..3198d1b 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/StringConfigurationLookupStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/StringConfigurationLookupStrategy.java
@@ -66,10 +66,9 @@ public class StringConfigurationLookupStrategy extends AbstractMetadataDrivenCon
         final IdPAttributeValue value = values.get(0);
         if (value instanceof StringAttributeValue) {
             return ((StringAttributeValue) value).getValue();
-        } else {
-            log.error("Tag '{}' contained non-string value, returning null");
-            return null;
         }
+        log.error("Tag '{}' contained non-string value, returning null");
+        return null;
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/SAMLMetadataContextLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/SAMLMetadataContextLookupFunction.java
index 625687b..c1281a7 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/SAMLMetadataContextLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/SAMLMetadataContextLookupFunction.java
@@ -40,9 +40,8 @@ public class SAMLMetadataContextLookupFunction extends AbstractRelyingPartyLooku
             if (peer != null) {
                 if (peer instanceof SAMLMetadataContext) {
                     return (SAMLMetadataContext) peer;
-                } else {
-                    return peer.getSubcontext(SAMLMetadataContext.class);
-                }    
+                }
+                return peer.getSubcontext(SAMLMetadataContext.class);    
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/messaging/SAMLMetadataContextLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/messaging/SAMLMetadataContextLookupFunction.java
index 31e81c8..b71ab75 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/messaging/SAMLMetadataContextLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/context/navigate/messaging/SAMLMetadataContextLookupFunction.java
@@ -40,9 +40,8 @@ public class SAMLMetadataContextLookupFunction extends AbstractRelyingPartyLooku
             if (peer != null) {
                 if (peer instanceof SAMLMetadataContext) {
                     return (SAMLMetadataContext) peer;
-                } else {
-                    return peer.getSubcontext(SAMLMetadataContext.class);
-                }    
+                }
+                return peer.getSubcontext(SAMLMetadataContext.class);    
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/logic/DefaultNameIdentifierFormatStrategy.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/logic/DefaultNameIdentifierFormatStrategy.java
index c6255b0..713c35e 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/logic/DefaultNameIdentifierFormatStrategy.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/logic/DefaultNameIdentifierFormatStrategy.java
@@ -134,10 +134,9 @@ public class DefaultNameIdentifierFormatStrategy extends MetadataNameIdentifierF
             if (fromMetadata.isEmpty()) {
                 log.debug("No formats specified in configuration or in metadata, returning default");
                 return Collections.singletonList(defaultFormat);
-            } else {
-                log.debug("Configuration did not specify any formats, relying on metadata alone");
-                return fromMetadata;
             }
+            log.debug("Configuration did not specify any formats, relying on metadata alone");
+            return fromMetadata;
         } else if (fromMetadata.isEmpty()) {
             log.debug("Metadata did not specify any formats, relying on configuration alone");
             return fromConfig;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/logic/SOAPErrorPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/logic/SOAPErrorPredicate.java
index f79ff33..710654b 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/logic/SOAPErrorPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/logic/SOAPErrorPredicate.java
@@ -88,10 +88,9 @@ public class SOAPErrorPredicate extends AbstractRelyingPartyPredicate {
         if (((ECPProfileConfiguration) rpCtx.getProfileConfig()).getLocalEvents(input).contains(event)) {
             log.debug("Error event {} will be handled locally", event);
             return false;
-        } else {
-            log.debug("Error event {} will be handled with SOAP fault", event);
-            return true;
         }
+        log.debug("Error event {} will be handled with SOAP fault", event);
+        return true;
     }
 
 }
\ No newline at end of file
diff --git a/idp-saml-impl/.settings/org.eclipse.jdt.core.prefs b/idp-saml-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-saml-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-saml-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
index 2e10d5e..937a10c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoder.java
@@ -110,10 +110,9 @@ public class SAML1ScopedStringAttributeTranscoder extends AbstractSAML1Attribute
                 }
                 
                 return ScopedStringAttributeValue.valueOf(stringValue, scopeValue);
-            } else {
-                log.warn("Object does not support required interface to access the scope via XML attribute");
-                return null;
             }
+            log.warn("Object does not support required interface to access the scope via XML attribute");
+            return null;
         } else if ("inline".equals(scopeType)) {
             final String scopeDelimiter = rule.getOrDefault(PROP_SCOPE_DELIMITER, String.class, "@");
             final int offset = stringValue.indexOf(scopeDelimiter);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
index 2e7739f..0b25d33 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoder.java
@@ -111,10 +111,9 @@ public class SAML2ScopedStringAttributeTranscoder extends AbstractSAML2Attribute
                 
                 return ScopedStringAttributeValue.valueOf(stringValue, scopeValue);
                 
-            } else {
-                log.warn("Object does not support required interface to access the scope via XML attribute");
-                return null;
             }
+            log.warn("Object does not support required interface to access the scope via XML attribute");
+            return null;
         } else if ("inline".equals(scopeType)) {
             final String scopeDelimiter = rule.getOrDefault(PROP_SCOPE_DELIMITER, String.class, "@");
             final int offset = stringValue.indexOf(scopeDelimiter);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SubStatusCodeAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SubStatusCodeAuditExtractor.java
index 2bd7813..b973d3a 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SubStatusCodeAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SubStatusCodeAuditExtractor.java
@@ -57,7 +57,7 @@ public class SubStatusCodeAuditExtractor implements Function<ProfileRequestConte
                         ((Response) response).getStatus() != null
                                 ? ((Response) response).getStatus().getStatusCode() : null;
                 if (sc != null && sc.getStatusCode() != null) {
-                    final Collection<String> values = new ArrayList(1);
+                    final Collection<String> values = new ArrayList<>(1);
                     do {
                         sc = sc.getStatusCode();
                         if (sc.getValue() != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/WriteFTICKSLog.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/WriteFTICKSLog.java
index df6a3db..c19bb19 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/WriteFTICKSLog.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/WriteFTICKSLog.java
@@ -89,11 +89,11 @@ public class WriteFTICKSLog extends AbstractProfileAction {
         relyingPartyLookupStrategy = new RelyingPartyIdLookupFunction();
         responderLookupStrategy = new ResponderIdLookupFunction();
         usernameLookupStrategy = new SubjectContextPrincipalLookupFunction().compose(
-                new ChildContextLookup(SubjectContext.class));
+                new ChildContextLookup<>(SubjectContext.class));
         authenticationMethodLookupStrategy = new AuthnContextAuditExtractor(
-                new MessageLookup(SAMLObject.class).compose(new OutboundMessageContextLookup()));
+                new MessageLookup<>(SAMLObject.class).compose(new OutboundMessageContextLookup()));
         statusCodeLookupStrategy = new StatusCodeAuditExtractor(
-                new MessageLookup(SAMLObject.class).compose(new OutboundMessageContextLookup()));
+                new MessageLookup<>(SAMLObject.class).compose(new OutboundMessageContextLookup()));
     }
     
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/AttributeMappingNodeProcessor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/AttributeMappingNodeProcessor.java
index 51ffb7f..2c77664 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/AttributeMappingNodeProcessor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/AttributeMappingNodeProcessor.java
@@ -150,7 +150,7 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
         }
         
         if (!results.isEmpty()) {
-            acs.getObjectMetadata().put(new AttributesMapContainer<>(results));
+            acs.getObjectMetadata().put(new AttributesMapContainer(results));
         }
     }
 
@@ -201,7 +201,7 @@ public class AttributeMappingNodeProcessor implements MetadataNodeProcessor {
         }
         
         if (!results.isEmpty()) {
-            extensions.getParent().getObjectMetadata().put(new AttributesMapContainer<>(results));
+            extensions.getParent().getObjectMetadata().put(new AttributesMapContainer(results));
         }
     }
   //CheckStyle: CyclomaticComplexity ON
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
index d7c7aa3..7a9302f 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/metadata/impl/MetadataResolverServiceGaugeSet.java
@@ -50,11 +50,13 @@ import net.shibboleth.utilities.java.support.service.ServiceableComponent;
 /**
  * Additional gauges for metadata resolvers.
  */
-public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet implements MetricSet, MetricFilter {
+public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet<MetadataResolver>
+    implements MetricSet, MetricFilter {
     
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(MetadataResolverServiceGaugeSet.class);
 
+// Checkstyle: MethodLength OFF
     /**
      * Constructor.
      * 
@@ -68,8 +70,9 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                 MetricRegistry.name(DEFAULT_METRIC_NAME, metricName, "update"),
                 new Gauge<Map<String,Instant>>() {
                     public Map<String,Instant> getValue() {
-                        return valueGetter(new BiConsumer<Builder, MetadataResolver>() {
-                            public void accept(final Builder mapBuilder, final MetadataResolver resolver) {
+                        return valueGetter(new BiConsumer<Builder<String,Instant>, MetadataResolver>() {
+                            public void accept(final Builder<String,Instant> mapBuilder,
+                                    final MetadataResolver resolver) {
                                 if (resolver instanceof RefreshableMetadataResolver
                                         && ((RefreshableMetadataResolver) resolver).getLastUpdate() != null) {
                                     mapBuilder.put(resolver.getId(),
@@ -84,8 +87,9 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                 MetricRegistry.name(DEFAULT_METRIC_NAME, metricName, "refresh"),
                 new Gauge<Map<String,Instant>>() {
                     public Map<String,Instant> getValue() {
-                        return valueGetter(new BiConsumer<Builder, MetadataResolver>() {
-                            public void accept(final Builder mapBuilder, final MetadataResolver resolver) {
+                        return valueGetter(new BiConsumer<Builder<String,Instant>, MetadataResolver>() {
+                            public void accept(final Builder<String,Instant> mapBuilder,
+                                    final MetadataResolver resolver) {
                                 if (resolver instanceof RefreshableMetadataResolver
                                         && ((RefreshableMetadataResolver) resolver).getLastRefresh() != null) {
                                     mapBuilder.put(resolver.getId(),
@@ -101,8 +105,9 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                 MetricRegistry.name(DEFAULT_METRIC_NAME, metricName, "successfulRefresh"),
                 new Gauge<Map<String,Instant>>() {
                     public Map<String,Instant> getValue() {
-                        return valueGetter(new BiConsumer<Builder, MetadataResolver>() {
-                            public void accept(final Builder mapBuilder, final MetadataResolver resolver) {
+                        return valueGetter(new BiConsumer<Builder<String,Instant>, MetadataResolver>() {
+                            public void accept(final Builder<String,Instant> mapBuilder,
+                                    final MetadataResolver resolver) {
                                 if (resolver instanceof RefreshableMetadataResolver
                                         && ((RefreshableMetadataResolver) resolver)
                                             .getLastSuccessfulRefresh()  != null) {
@@ -119,8 +124,9 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                 MetricRegistry.name(DEFAULT_METRIC_NAME, metricName, "rootValidUntil"),
                 new Gauge<Map<String,Instant>>() {
                     public Map<String,Instant> getValue() {
-                        return valueGetter(new BiConsumer<Builder, MetadataResolver>() {
-                            public void accept(final Builder mapBuilder, final MetadataResolver resolver) {
+                        return valueGetter(new BiConsumer<Builder<String,Instant>, MetadataResolver>() {
+                            public void accept(final Builder<String,Instant> mapBuilder,
+                                    final MetadataResolver resolver) {
                                 if (resolver instanceof BatchMetadataResolver
                                         && ((BatchMetadataResolver) resolver).getRootValidUntil() != null) {
                                     mapBuilder.put(resolver.getId(),
@@ -131,6 +137,7 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                     }
                 });
     }
+// Checkstyle: MethodLength ON
 
     /** Helper Function for map construction.<br/>
      * 
@@ -139,9 +146,9 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
      * @param consume the thing which does checking and adding the building
      * @return an appropriate map
      */
-    private Map<String,Instant> valueGetter(final BiConsumer<Builder, MetadataResolver> consume) {
-        final Builder mapBuilder = ImmutableMap.<String,Instant>builder();
-        final ServiceableComponent<MetadataResolver> component = getService().getServiceableComponent();
+    private Map<String,Instant> valueGetter(final BiConsumer<Builder<String,Instant>, MetadataResolver> consume) {
+        final Builder<String,Instant> mapBuilder = ImmutableMap.builder();
+        final ServiceableComponent<?> component = getService().getServiceableComponent();
         if (component != null) {
             try {
                 // Check type - just in case
@@ -149,7 +156,8 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
                     log.warn("{} : Injected Service was not for an Metadata Resolver : ({}) ",
                             getLogPrefix(), component.getComponent().getClass());
                 } else {
-                    for (final MetadataResolver resolver : getMetadataResolvers(component.getComponent())) {
+                    for (final MetadataResolver resolver : getMetadataResolvers(
+                            (MetadataResolver) component.getComponent())) {
                         consume.accept(mapBuilder, resolver);
                     }
                 }
@@ -166,23 +174,21 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
 
-        final ServiceableComponent component = getService().getServiceableComponent();
+        final ServiceableComponent<?> component = getService().getServiceableComponent();
         if (component != null) {
             try {
                 if (component.getComponent() instanceof MetadataResolver) {
                     return;
-                } else {
-                    log.error("{} : Injected service was not for a MetadataResolver ({}) ",
-                            getLogPrefix(), component.getClass());
-                    throw new ComponentInitializationException("Injected service was not for a MetadataResolver");
                 }
+                log.error("{} : Injected service was not for a MetadataResolver ({}) ",
+                        getLogPrefix(), component.getClass());
+                throw new ComponentInitializationException("Injected service was not for a MetadataResolver");
             } finally {
                 component.unpinComponent();
             }
-        } else {
-            log.debug("{} : Injected service has not initialized sucessfully yet. Skipping type test",
-                    getLogPrefix());
         }
+        log.debug("{} : Injected service has not initialized sucessfully yet. Skipping type test",
+                getLogPrefix());
     }
 
     /** Get all the resolvers rooted in the provider tree (including the root).
@@ -222,9 +228,8 @@ public class MetadataResolverServiceGaugeSet extends ReloadableServiceGaugeSet i
         
         if (root instanceof ChainingMetadataResolver) {
             return getAllChildren((ChainingMetadataResolver) root);
-        } else {
-            return Collections.singletonList(root);
         }
+        return Collections.singletonList(root);
     }
 
 }
\ No newline at end of file
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
index fd71630..99cbe6f 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
@@ -175,9 +175,8 @@ public class AttributeSourcedSAML1NameIdentifierGenerator extends AbstractSAML1N
                                 nameIdentifier.getFormat())) {
                             log.info("Returning NameIdentifier from XMLObject-valued attribute {}", sourceId);
                             return nameIdentifier;
-                        } else {
-                            log.debug("Attribute {} value was NameIdentifier, but Format did not match", sourceId);
                         }
+                        log.debug("Attribute {} value was NameIdentifier, but Format did not match", sourceId);
                     }
                 }
             }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
index 865d5a4..0389215 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
@@ -172,9 +172,8 @@ public class AttributeSourcedSAML2NameIDGenerator extends AbstractSAML2NameIDGen
                             ((NameID) ((XMLObjectAttributeValue) value).getValue()).getFormat())) {
                         log.info("Returning NameID from XMLObject-valued attribute {}", sourceId);
                         return (NameID) ((XMLObjectAttributeValue) value).getValue();
-                    } else {
-                        log.debug("Attribute {} value was NameID, but Format did not match", sourceId);
                     }
+                    log.debug("Attribute {} value was NameID, but Format did not match", sourceId);
                 }
             }
         }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
index 740695a..3f3de4d 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
@@ -61,10 +61,10 @@ public abstract class BaseTransformingDecoder extends AbstractIdentifiableInitia
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         Constraint.isNotNull(newTransforms, "Transforms collection cannot be null");
         
-        transforms = new ArrayList();
+        transforms = new ArrayList<>();
         for (final Pair<String,String> p : newTransforms) {
             final Pattern pattern = Pattern.compile(StringSupport.trimOrNull(p.getFirst()));
-            transforms.add(new Pair(pattern, Constraint.isNotNull(
+            transforms.add(new Pair<>(pattern, Constraint.isNotNull(
                     StringSupport.trimOrNull(p.getSecond()), "Replacement expression cannot be null")));
         }
     }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransientDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransientDecoder.java
index d4c03c4..deae3b2 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransientDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransientDecoder.java
@@ -90,7 +90,7 @@ public abstract class BaseTransientDecoder extends AbstractIdentifiableInitializ
         }
 
         try {
-            final StorageRecord record = idStore.read(TransientIdParameters.CONTEXT, transientId);
+            final StorageRecord<?> record = idStore.read(TransientIdParameters.CONTEXT, transientId);
             if (null == record) {
                 log.info("{} Could not find transient identifier", getLogPrefix());
                 return null;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientIdGenerationStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientIdGenerationStrategy.java
index 8eb9101..16cefa2 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientIdGenerationStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientIdGenerationStrategy.java
@@ -172,9 +172,8 @@ public class StoredTransientIdGenerationStrategy extends AbstractIdentifiableIni
             while (collisions < 5) {
                 if (idStore.create(TransientIdParameters.CONTEXT, id, principalTokenId, expiration.toEpochMilli())) {
                     return id;
-                } else {
-                    ++collisions;
                 }
+                ++collisions;
             }
         
             throw new SAMLException("Exceeded allowable number of collisions");
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseIdPInitiatedSSORequestMessageDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseIdPInitiatedSSORequestMessageDecoder.java
index d66fa36..9569bdb 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseIdPInitiatedSSORequestMessageDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseIdPInitiatedSSORequestMessageDecoder.java
@@ -208,12 +208,10 @@ public abstract class BaseIdPInitiatedSSORequestMessageDecoder extends AbstractH
             final String sessionID = request.getRequestedSessionId();
             if (sessionID != null) {
                 return "_" + sessionID + '!' + timeString;
-            } else {
-                return idGenerator.generateIdentifier();
             }
-        } else {
             return idGenerator.generateIdentifier();
         }
+        return idGenerator.generateIdentifier();
     }
     
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
index 105d50e..f592574 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
@@ -510,7 +510,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
      * 
      * @return criterion to give to resolver
      */
-    @Nonnull private EndpointCriterion buildEndpointCriterion(@Nonnull @NotEmpty final String unverifiedBinding) {
+    @Nonnull private EndpointCriterion<?> buildEndpointCriterion(@Nonnull @NotEmpty final String unverifiedBinding) {
         final Endpoint endpoint = (Endpoint) endpointBuilder.buildObject(endpointType);
         
         if (inboundMessage instanceof IdPInitiatedSSORequest) {
@@ -538,11 +538,11 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
                 endpoint.setBinding(unverifiedBinding);
                 log.debug("{} Defaulting binding in \"unverified\" request to {}", getLogPrefix(), unverifiedBinding);
             }
-            return new EndpointCriterion(endpoint, true);
-        } else {
-            // Here we only skip endpoint validation if the skip flag has been set.
-            return new EndpointCriterion(endpoint, skipValidationSinceSigned);
+            return new EndpointCriterion<>(endpoint, true);
         }
+        
+        // Here we only skip endpoint validation if the skip flag has been set.
+        return new EndpointCriterion<>(endpoint, skipValidationSinceSigned);
     }
     
 }
\ No newline at end of file
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertion.java
index 353b8b8..23543d3 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertion.java
@@ -216,9 +216,8 @@ public class AddAttributeStatementToAssertion extends BaseAddAttributeStatementT
                     if (isStatementInOwnAssertion() || ((Response) outboundMessage).getAssertions().isEmpty()) {
                         return SAML1ActionSupport.addAssertionToResponse(AddAttributeStatementToAssertion.this,
                                 (Response) outboundMessage, getIdGenerator(), getIssuerId());
-                    } else {
-                        return ((Response) outboundMessage).getAssertions().get(0);
-                    } 
+                    }
+                    return ((Response) outboundMessage).getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertion.java
index f1d7e4c..cd2a90b 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertion.java
@@ -206,9 +206,8 @@ public class AddAuthenticationStatementToAssertion extends BaseAddAuthentication
                     if (isStatementInOwnAssertion() || ((Response) outboundMessage).getAssertions().isEmpty()) {
                         return SAML1ActionSupport.addAssertionToResponse(AddAuthenticationStatementToAssertion.this,
                                 (Response) outboundMessage, getIdGenerator(), getIssuerId());
-                    } else {
-                        return ((Response) outboundMessage).getAssertions().get(0);
-                    } 
+                    }
+                    return ((Response) outboundMessage).getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignators.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignators.java
index b773978..769438f 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignators.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignators.java
@@ -87,7 +87,7 @@ public class FilterByQueriedAttributeDesignators extends AbstractProfileAction {
         attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
                 new ChildContextLookup<>(RelyingPartyContext.class));
         
-        requestLookupStrategy = new MessageLookup(Request.class).compose(new InboundMessageContextLookup());
+        requestLookupStrategy = new MessageLookup<>(Request.class).compose(new InboundMessageContextLookup());
     }
 
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionToken.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionToken.java
index fbb48c8..39f346a 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionToken.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionToken.java
@@ -316,9 +316,8 @@ public class AddAuthnStatementToAssertionFromInboundAssertionToken extends Abstr
                         return SAML2ActionSupport.addAssertionToResponse(
                                 AddAuthnStatementToAssertionFromInboundAssertionToken.this,
                                 (Response) outboundMessage, getIdGenerator(), getIssuerId());
-                    } else {
-                        return ((Response) outboundMessage).getAssertions().get(0);
-                    } 
+                    }
+                    return ((Response) outboundMessage).getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationPolicyToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationPolicyToAssertion.java
index 4850cc6..672a913 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationPolicyToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationPolicyToAssertion.java
@@ -191,11 +191,10 @@ public class AddDelegationPolicyToAssertion extends AbstractProfileAction {
                 if (relyingPartyContext.getProfileConfig() instanceof BrowserSSOProfileConfiguration) {
                     return ((BrowserSSOProfileConfiguration) relyingPartyContext.getProfileConfig())
                             .getMaximumTokenDelegationChainLength(profileRequestContext);
-                } else {
-                    log.debug("Profile config was not BrowserSSOProfileConfiguration, can't evaluate: {}", 
-                            relyingPartyContext.getProfileConfig() != null ? 
-                                    relyingPartyContext.getProfileConfig().getClass().getName() : "null");
                 }
+                log.debug("Profile config was not BrowserSSOProfileConfiguration, can't evaluate: {}", 
+                        relyingPartyContext.getProfileConfig() != null ? 
+                                relyingPartyContext.getProfileConfig().getClass().getName() : "null");
             }
         }
         log.debug("Unable to resolve max delegation chain length from inbound token or profile config, " 
@@ -219,16 +218,15 @@ public class AddDelegationPolicyToAssertion extends AbstractProfileAction {
                     final Response response = (Response) outboundMessage;
                     if (response.getAssertions().isEmpty()) {
                         return null;
-                    } else {
-                        for (final Assertion theAssertion : response.getAssertions()) {
-                            if (!theAssertion.getAuthnStatements().isEmpty()) {
-                                log.debug("Found Assertion with AuthnStatement to decorate in outbound Response");
-                                return theAssertion;
-                            }
+                    }
+                    for (final Assertion theAssertion : response.getAssertions()) {
+                        if (!theAssertion.getAuthnStatements().isEmpty()) {
+                            log.debug("Found Assertion with AuthnStatement to decorate in outbound Response");
+                            return theAssertion;
                         }
-                        log.debug("Found no Assertion with AuthnStatement in outbound Response, returning first");
-                        return response.getAssertions().get(0);
-                    } 
+                    }
+                    log.debug("Found no Assertion with AuthnStatement in outbound Response, returning first");
+                    return response.getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationRestrictionToAssertions.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationRestrictionToAssertions.java
index 74666b6..c89a8ae 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationRestrictionToAssertions.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddDelegationRestrictionToAssertions.java
@@ -282,10 +282,9 @@ public class AddDelegationRestrictionToAssertions extends AbstractProfileAction
             if (DelegationRestrictionType.TYPE_NAME.equals(conditionChild.getSchemaType())) {
                 if (conditionChild instanceof DelegationRestrictionType) {
                     return (DelegationRestrictionType) conditionChild;
-                } else {
-                    log.warn("Saw Condition of xsi:type DelegationRestrictionType, but incorrect class instance: {}",
-                            conditionChild.getClass().getName());
                 }
+                log.warn("Saw Condition of xsi:type DelegationRestrictionType, but incorrect class instance: {}",
+                        conditionChild.getClass().getName());
             }
         }
         return null;
@@ -312,4 +311,4 @@ public class AddDelegationRestrictionToAssertions extends AbstractProfileAction
         return newDelegate;
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertion.java
index dc9ef7f..b8154f0 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertion.java
@@ -366,9 +366,8 @@ public class DecorateDelegatedAssertion extends AbstractProfileAction {
             if (libertySSOSEndpointURL != null) {
                 log.debug("Using Liberty SSOS endpoint URL resolved via strategy: {}", libertySSOSEndpointURL);
                 return;
-            } else {
-                log.debug("Liberty SSOS endpoint URL strategy was unable to resolve a value");
             }
+            log.debug("Liberty SSOS endpoint URL strategy was unable to resolve a value");
         }
         log.debug("No effective Liberty SSOS endpoint URL could be determined");
     }
@@ -585,24 +584,22 @@ public class DecorateDelegatedAssertion extends AbstractProfileAction {
                     if (response.getAssertions().isEmpty()) {
                         log.debug("Outbound Response contained no Assertions, nothing to decorate");
                         return Collections.emptyList();
-                    } else { 
-                        for (final Assertion assertion : response.getAssertions()) {
-                            if (!assertion.getAuthnStatements().isEmpty()) {
-                                log.debug("Found Assertion with AuthnStatement to decorate in outbound Response");
-                                return Collections.singletonList(assertion);
-                            }
+                    }
+                    for (final Assertion assertion : response.getAssertions()) {
+                        if (!assertion.getAuthnStatements().isEmpty()) {
+                            log.debug("Found Assertion with AuthnStatement to decorate in outbound Response");
+                            return Collections.singletonList(assertion);
                         }
-                        log.debug("Found no Assertion with AuthnStatement in outbound Response, returning first");
-                        return Collections.singletonList(response.getAssertions().get(0));
                     }
+                    log.debug("Found no Assertion with AuthnStatement in outbound Response, returning first");
+                    return Collections.singletonList(response.getAssertions().get(0));
                 } else {
                     log.debug("Found no Assertion to decorate");
                     return null;
                 }
-            } else {
-                log.debug("Input ProfileRequestContext or outbound MessageContext was null");
-                return null;
             }
+            log.debug("Input ProfileRequestContext or outbound MessageContext was null");
+            return null;
         }
         
     }
@@ -628,10 +625,9 @@ public class DecorateDelegatedAssertion extends AbstractProfileAction {
                         LibertyConstants.DEFAULT_SSOS_ENDPOINT_URL_PORT,
                         request.getServletContext().getContextPath() 
                             + LibertyConstants.DEFAULT_SSOS_ENDPOINT_URL_RELATIVE_PATH);
-            } else {
-                log.debug("Input HttpServletRequest was null");
-                return null;
             }
+            log.debug("Input HttpServletRequest was null");
+            return null;
         }
     }
 }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicy.java
index 9189721..b6d9131 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicy.java
@@ -306,10 +306,9 @@ public class EvaluateDelegationPolicy extends AbstractProfileAction {
             if (DelegationRestrictionType.TYPE_NAME.equals(conditionChild.getSchemaType())) {
                 if (conditionChild instanceof DelegationRestrictionType) {
                     return (DelegationRestrictionType) conditionChild;
-                } else {
-                    log.warn("Saw Condition of xsi:type DelegationRestrictionType, but incorrect class instance: {}",
-                            conditionChild.getClass().getName());
                 }
+                log.warn("Saw Condition of xsi:type DelegationRestrictionType, but incorrect class instance: {}",
+                        conditionChild.getClass().getName());
             }
         }
         return null;
@@ -328,11 +327,10 @@ public class EvaluateDelegationPolicy extends AbstractProfileAction {
         if (value != null) {
             log.debug("Strategy resolved policy max token delegation chain length: {}", value);
             return value;
-        } else {
-            log.debug("Returning default policy max token delegation chain length: {}", 
-                    BrowserSSOProfileConfiguration.DEFAULT_DELEGATION_CHAIN_LENGTH);
-            return BrowserSSOProfileConfiguration.DEFAULT_DELEGATION_CHAIN_LENGTH;
         }
+        log.debug("Returning default policy max token delegation chain length: {}", 
+                BrowserSSOProfileConfiguration.DEFAULT_DELEGATION_CHAIN_LENGTH);
+        return BrowserSSOProfileConfiguration.DEFAULT_DELEGATION_CHAIN_LENGTH;
         
     }
     
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateDelegationContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateDelegationContext.java
index 65dd2e8..8a39907 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateDelegationContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateDelegationContext.java
@@ -524,10 +524,9 @@ public class PopulateDelegationContext extends AbstractProfileAction {
                 if (requestedAttribute.isRequired()) {
                     log.debug("Metadata delegation request attribute indicated it was required");
                     return DelegationRequest.REQUESTED_REQUIRED;
-                } else {
-                    log.debug("Metadata delegation request attribute indicated it was NOT required");
-                    return DelegationRequest.REQUESTED_OPTIONAL;
                 }
+                log.debug("Metadata delegation request attribute indicated it was NOT required");
+                return DelegationRequest.REQUESTED_OPTIONAL;
             }
         }
         
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContext.java
index aff2843..321ca52 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContext.java
@@ -155,7 +155,7 @@ public class PopulateLibertyContext extends AbstractProfileAction {
                 return null;
             }
             
-            for (final Token token : wssContext.getTokens()) {
+            for (final Token<?> token : wssContext.getTokens()) {
                 if (token.getValidationStatus().equals(ValidationStatus.VALID) 
                         && token instanceof SAML20AssertionToken) {
                     return (SAML20AssertionToken) token;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/ProcessDelegatedAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/ProcessDelegatedAssertion.java
index 4b8f3df..17cb311 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/ProcessDelegatedAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/ProcessDelegatedAssertion.java
@@ -205,9 +205,8 @@ public class ProcessDelegatedAssertion extends AbstractProfileAction {
                 if (presenterContext != null) {
                     log.debug("Saw SAML presenter entityID: {}", presenterContext.getEntityId());
                     return presenterContext.getEntityId();
-                } else {
-                    return null;
                 }
+                return null;
             }
             
             return null;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandler.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandler.java
index 2d594ed..f5ab1bd 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandler.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandler.java
@@ -74,10 +74,9 @@ public class AddSenderHandler extends AbstractHeaderGeneratingMessageHandler {
         if (providerId != null) {
             log.debug("Resolved Liberty ID-WSF Sender providerId value: {}", providerId);
             return true;
-        } else {
-            log.debug("Unable to resolve Liberty ID-WSF Sender providerId value, skipping further processing");
-            return false;
         }
+        log.debug("Unable to resolve Liberty ID-WSF Sender providerId value, skipping further processing");
+        return false;
     }
 
     /** {@inheritDoc} */
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11Encoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11Encoder.java
index 2a3f6be..975074d 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11Encoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11Encoder.java
@@ -24,7 +24,6 @@ import javax.annotation.Nonnull;
 import javax.servlet.http.HttpServletResponse;
 
 import net.shibboleth.idp.saml.saml2.profile.delegation.impl.LibertyConstants;
-import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.net.HttpServletSupport;
 import net.shibboleth.utilities.java.support.xml.SerializeSupport;
 
@@ -66,11 +65,10 @@ public class LibertyHTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageE
     public LibertyHTTPSOAP11Encoder() {
         super();
         final XMLObjectBuilderFactory builderFactory = XMLObjectProviderRegistrySupport.getBuilderFactory();
-        envBuilder = (SOAPObjectBuilder<Envelope>) builderFactory.getBuilder(Envelope.DEFAULT_ELEMENT_NAME);
-        bodyBuilder = (SOAPObjectBuilder<Body>) builderFactory.getBuilder(Body.DEFAULT_ELEMENT_NAME);
-        
-        Constraint.isNotNull(envBuilder, "Envelope Builder cannot be null");
-        Constraint.isNotNull(bodyBuilder, "Body Builder cannot be null");
+        envBuilder = (SOAPObjectBuilder<Envelope>) builderFactory.<Envelope>getBuilderOrThrow(
+                Envelope.DEFAULT_ELEMENT_NAME);
+        bodyBuilder = (SOAPObjectBuilder<Body>) builderFactory.<Body>getBuilderOrThrow(
+                Body.DEFAULT_ELEMENT_NAME);
     }
     
     /** {@inheritDoc} */
@@ -219,9 +217,8 @@ public class LibertyHTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageE
         final List<XMLObject> objList = header.getUnknownXMLObjects(Action.ELEMENT_NAME);
         if (objList == null || objList.isEmpty()) {
             return null;
-        } else {
-            return ((Action)objList.get(0)).getValue();
         }
+        return ((Action)objList.get(0)).getValue();
     }
     
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertion.java
index 58c7559..8228b64 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertion.java
@@ -219,9 +219,8 @@ public class AddAttributeStatementToAssertion extends BaseAddAttributeStatementT
                     if (isStatementInOwnAssertion() || ((Response) outboundMessage).getAssertions().isEmpty()) {
                         return SAML2ActionSupport.addAssertionToResponse(AddAttributeStatementToAssertion.this,
                                 (Response) outboundMessage, getIdGenerator(), getIssuerId());
-                    } else {
-                        return ((Response) outboundMessage).getAssertions().get(0);
-                    } 
+                    }
+                    return ((Response) outboundMessage).getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertion.java
index 6d72132..386cbd1 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertion.java
@@ -277,9 +277,8 @@ public class AddAuthnStatementToAssertion extends BaseAddAuthenticationStatement
                     if (isStatementInOwnAssertion() || ((Response) outboundMessage).getAssertions().isEmpty()) {
                         return SAML2ActionSupport.addAssertionToResponse(AddAuthnStatementToAssertion.this,
                                 (Response) outboundMessage, getIdGenerator(), getIssuerId());
-                    } else {
-                        return ((Response) outboundMessage).getAssertions().get(0);
-                    } 
+                    }
+                    return ((Response) outboundMessage).getAssertions().get(0); 
                 }
             }
             
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributes.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributes.java
index 717bca6..3a52eef 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributes.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributes.java
@@ -89,7 +89,7 @@ public class FilterByQueriedAttributes extends AbstractProfileAction {
         attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
                 new ChildContextLookup<>(RelyingPartyContext.class));
         
-        queryLookupStrategy = new MessageLookup(AttributeQuery.class).compose(new InboundMessageContextLookup());
+        queryLookupStrategy = new MessageLookup<>(AttributeQuery.class).compose(new InboundMessageContextLookup());
     }
 
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/MapRequestedAttributesInAttributeConsumingService.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/MapRequestedAttributesInAttributeConsumingService.java
index fcbb462..b8a3282 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/MapRequestedAttributesInAttributeConsumingService.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/MapRequestedAttributesInAttributeConsumingService.java
@@ -67,7 +67,7 @@ public class MapRequestedAttributesInAttributeConsumingService extends AbstractP
     public MapRequestedAttributesInAttributeConsumingService() {
         // At this point, by default  the SAMLMetadataContext hangs off the SAMLPeerContext
         attributeConsumingServiceContextLookupStrategy =
-                new ChildContextLookup(AttributeConsumingServiceContext.class).compose(
+                new ChildContextLookup<>(AttributeConsumingServiceContext.class).compose(
                         new ChildContextLookup<>(SAMLMetadataContext.class).compose(
                                 new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
                                         new InboundMessageContextLookup())));
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/PopulateEncryptionParameters.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/PopulateEncryptionParameters.java
index 2214f81..3240a0a 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/PopulateEncryptionParameters.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/PopulateEncryptionParameters.java
@@ -225,7 +225,7 @@ public class PopulateEncryptionParameters extends AbstractProfileAction {
         if (encParamsresolver == null) {
             throw new ComponentInitializationException("EncryptionParametersResolver cannot be null");
         } else if (configurationLookupStrategy == null) {
-            configurationLookupStrategy = new Function<ProfileRequestContext,List<EncryptionConfiguration>>() {
+            configurationLookupStrategy = new Function<>() {
                 public List<EncryptionConfiguration> apply(final ProfileRequestContext input) {
                     return Collections.singletonList(SecurityConfigurationSupport.getGlobalEncryptionConfiguration());
                 }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequest.java
index 19f8087..1da0598 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequest.java
@@ -133,15 +133,13 @@ public class ProcessLogoutRequest extends AbstractProfileAction {
         sessionContextCreationStrategy = new ChildContextLookup<>(SessionContext.class, true);
         logoutContextCreationStrategy = new ChildContextLookup<>(LogoutContext.class, true);
         
-        sessionResolverCriteriaStrategy = new Function<ProfileRequestContext,CriteriaSet>() {
-            @Override
+        sessionResolverCriteriaStrategy = new Function<>() {
             public CriteriaSet apply(final ProfileRequestContext input) {
                 if (logoutRequest != null && logoutRequest.getIssuer() != null && logoutRequest.getNameID() != null) {
                     return new CriteriaSet(new SPSessionCriterion(logoutRequest.getIssuer().getValue(),
                             logoutRequest.getNameID().getValue()));
-                } else {
-                    return new CriteriaSet();
                 }
+                return new CriteriaSet();
             }
         };
     
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
index afe451b..d85bef2 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
@@ -257,7 +257,7 @@ public class SOAPLogoutRequest extends AbstractProfileAction {
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         try {
-            final InOutOperationContext opContext = new SAMLSOAPClientContextBuilder()
+            final InOutOperationContext opContext = new SAMLSOAPClientContextBuilder<>()
                     .setOutboundMessage(logoutRequest)
                     .setProtocol(SAMLConstants.SAML20P_NS)
                     .setPipelineName(soapPipelineName)
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/KeyAuthorityNodeProcessor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/KeyAuthorityNodeProcessor.java
index c8ce534..17fa6a7 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/KeyAuthorityNodeProcessor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/KeyAuthorityNodeProcessor.java
@@ -124,9 +124,8 @@ public class KeyAuthorityNodeProcessor implements MetadataNodeProcessor {
         final List<XMLObject> keyAuthorities = extensions.getUnknownXMLObjects(KeyAuthority.DEFAULT_ELEMENT_NAME);
         if (keyAuthorities == null) {
             return Collections.emptyList();
-        } else {
-            return keyAuthorities;
         }
+        return keyAuthorities;
     }
     
 }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/MetadataPKIXValidationInformationResolver.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/MetadataPKIXValidationInformationResolver.java
index 867810e..bc41c0c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/MetadataPKIXValidationInformationResolver.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/security/impl/MetadataPKIXValidationInformationResolver.java
@@ -104,9 +104,8 @@ public class MetadataPKIXValidationInformationResolver extends AbstractInitializ
         final Iterator<PKIXValidationInformation> pkixInfoIter = resolve(criteriaSet).iterator();
         if (pkixInfoIter.hasNext()) {
             return pkixInfoIter.next();
-        } else {
-            return null;
         }
+        return null;
     }
 
     /** {@inheritDoc} */
@@ -301,9 +300,8 @@ public class MetadataPKIXValidationInformationResolver extends AbstractInitializ
                 log.debug("Resolved cached PKIXValidationInformation from KeyAuthority object metadata");
                 accumulator.addAll(cachedPKIXInfo);
                 return;
-            } else {
-                log.debug("Found no cached PKIXValidationInformation in KeyAuthority object metadata, resolving XML");
             }
+            log.debug("Found no cached PKIXValidationInformation in KeyAuthority object metadata, resolving XML");
         } finally {
             // Note: with the standard Java ReentrantReadWriteLock impl, you can not upgrade a read lock
             // to a write lock! So have to release here and then acquire the write lock below.
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/AddLogoutRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/AddLogoutRequest.java
index 2a6553e..bcd6666 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/AddLogoutRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/AddLogoutRequest.java
@@ -96,7 +96,7 @@ public class AddLogoutRequest extends AbstractProfileAction {
     /** Constructor. */
     public AddLogoutRequest() {
         // Default strategy is a 16-byte secure random source.
-        idGeneratorLookupStrategy = new Function<ProfileRequestContext,IdentifierGenerationStrategy>() {
+        idGeneratorLookupStrategy = new Function<>() {
             public IdentifierGenerationStrategy apply(final ProfileRequestContext input) {
                 return new SecureRandomIdentifierGenerationStrategy();
             }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionSerializer.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionSerializer.java
index ad5fe1a..f3a7374 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionSerializer.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionSerializer.java
@@ -115,9 +115,8 @@ public class SAML2SPSessionSerializer extends AbstractSPSessionSerializer {
             final XMLObject nameID = XMLObjectSupport.unmarshallFromReader(parserPool, new StringReader(rawNameID));
             if (nameID instanceof NameID) {
                 return new SAML2SPSession(id, creation, expiration, (NameID) nameID, sessionIndex);
-            } else {
-                throw new IOException("XMLObject stored in NameID field was not a NameID");
             }
+            throw new IOException("XMLObject stored in NameID field was not a NameID");
         } catch (final XMLParserException | UnmarshallingException e) {
             throw new IOException("Unable to parse or unmarshall NameID field", e);
         }
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
index 4f9f89b..0b26ffc 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
@@ -225,7 +225,6 @@ public final class TestSources {
         return retVal; 
     }
     
-    @SuppressWarnings("unused")
     private static class StaticAttributeDefinition extends AbstractAttributeDefinition {
 
         /** Static value returned by this definition. */
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
index 7e533cf..c8741e1 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
@@ -98,7 +98,7 @@ public class StoredTransientSAML1NameIdentifierGeneratorTest extends OpenSAMLIni
 
         String val = name.getValue();
 
-        final StorageRecord record = store.read(TransientIdParameters.CONTEXT, val);
+        final StorageRecord<?> record = store.read(TransientIdParameters.CONTEXT, val);
         
         Assert.assertNotNull(record);
         Assert.assertTrue(val.length() >= transientGenerator.getIdSize());
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
index 332ecce..b137455 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
@@ -100,7 +100,7 @@ public class StoredTransientSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTes
 
         String val = name.getValue();
 
-        final StorageRecord record = store.read(TransientIdParameters.CONTEXT, val);
+        final StorageRecord<?> record = store.read(TransientIdParameters.CONTEXT, val);
         
         Assert.assertNotNull(record);
         Assert.assertTrue(val.length() >= transientGenerator.getIdSize());
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
index 566555a..4a58df7 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
@@ -65,8 +65,8 @@ public class InitializeOutboundMessageContextForErrorTest extends OpenSAMLInitBa
     
     @Test(expectedExceptions=ComponentInitializationException.class)
     public void testBadConfig() throws ComponentInitializationException {
-        final InitializeOutboundMessageContextForError action = new InitializeOutboundMessageContextForError();
-        action.initialize();
+        final InitializeOutboundMessageContextForError a = new InitializeOutboundMessageContextForError();
+        a.initialize();
     }
 
     @Test public void testWithOutboundContext() {
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
index 1bd4508..7cf3932 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
@@ -100,7 +100,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
                 prc.getOutboundMessageContext().getSubcontext(SAMLPeerEntityContext.class, true));
         
         action = new PopulateBindingAndEndpointContexts();
-        action.setEndpointResolver(new DefaultEndpointResolver());
+        action.setEndpointResolver(new DefaultEndpointResolver<>());
         action.setEndpointType(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         final List<BindingDescriptor> bindings = new ArrayList<>();
         bindings.add(new BindingDescriptor());
@@ -138,7 +138,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         binding.setActivationCondition(Predicates.<ProfileRequestContext>alwaysFalse());
         binding.initialize();
         final PopulateBindingAndEndpointContexts badaction = new PopulateBindingAndEndpointContexts();
-        badaction.setEndpointResolver(new DefaultEndpointResolver());
+        badaction.setEndpointResolver(new DefaultEndpointResolver<>());
         badaction.setBindingDescriptorsLookupStrategy(
                 FunctionSupport.<ProfileRequestContext,List<BindingDescriptor>>constant(Collections.singletonList(binding)));
         badaction.initialize();
@@ -288,7 +288,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         binding.setSynchronous(true);
         binding.initialize();
         final PopulateBindingAndEndpointContexts badaction = new PopulateBindingAndEndpointContexts();
-        badaction.setEndpointResolver(new DefaultEndpointResolver());
+        badaction.setEndpointResolver(new DefaultEndpointResolver<>());
         badaction.setBindingDescriptorsLookupStrategy(
                 FunctionSupport.<ProfileRequestContext,List<BindingDescriptor>>constant(Collections.singletonList(binding)));
         badaction.initialize();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
index 1734348..4415d9f 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAttributeStatementToAssertionTest.java
@@ -129,7 +129,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         registry.initialize();
         
         action = new AddAttributeStatementToAssertion();
-        action.setTranscoderRegistry(new MockReloadableService(registry));
+        action.setTranscoderRegistry(new MockReloadableService<>(registry));
     }
 
     /** Test that the action errors out properly if there is no relying party context. */
@@ -191,7 +191,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
-        action.setTranscoderRegistry(new MockReloadableService(localregistry));
+        action.setTranscoderRegistry(new MockReloadableService<>(localregistry));
 
         final IdPAttribute attribute = new IdPAttribute(MY_NAME_1);
         attribute.setValues(Arrays.asList(new StringAttributeValue(MY_VALUE_1)));
@@ -227,7 +227,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
-        action.setTranscoderRegistry(new MockReloadableService(localregistry));
+        action.setTranscoderRegistry(new MockReloadableService<>(localregistry));
 
         final IdPAttribute attribute = new IdPAttribute(MY_NAME_1);
         attribute.setValues(Arrays.asList(new StringAttributeValue(MY_VALUE_1)));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
index 9c5514d..43691be 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
@@ -68,8 +68,7 @@ public class FilterByQueriedAttributeDesignatorsTest extends XMLObjectBaseTestCa
 
     protected <Type> Type getBean(String fileName, Class<Type> claz) {
 
-        GenericApplicationContext context = new GenericApplicationContext();
-        try {
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
             SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                     new SchemaTypeAwareXMLBeanDefinitionReader(context);
     
@@ -82,13 +81,11 @@ public class FilterByQueriedAttributeDesignatorsTest extends XMLObjectBaseTestCa
             Assert.assertEquals(beans.size(), 1);
     
             return beans.iterator().next();
-        } finally {
-            context.close();
         }
     }
         
     @BeforeClass public void setup() {
-        registry = new MockReloadableService(getBean(PATH + "saml1Mapper.xml", AttributeTranscoderRegistryImpl.class));
+        registry = new MockReloadableService<>(getBean(PATH + "saml1Mapper.xml", AttributeTranscoderRegistryImpl.class));
     }
     
     @BeforeMethod public void setUpMethod() throws ComponentInitializationException, XMLParserException, UnmarshallingException {
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertionTest.java
index cdc579b..7ba6def 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DecorateDelegatedAssertionTest.java
@@ -336,7 +336,7 @@ public class DecorateDelegatedAssertionTest extends OpenSAMLInitBaseTestCase {
         // Sanity check
         Assert.assertEquals(servletRequest.getRequestURL().toString(), "https://idp.example.org/idp/profile/SAML2/Redirect/SSO");
         
-        Pair<ProfileRequestContext, HttpServletRequest> input = new Pair<>(prc, (HttpServletRequest)servletRequest);
+        Pair<ProfileRequestContext, HttpServletRequest> input = new Pair<>(prc, servletRequest);
         
         LibertySSOSEndpointURLStrategy strategy = new DecorateDelegatedAssertion.LibertySSOSEndpointURLStrategy();
         Assert.assertEquals(strategy.apply(input), ssosURL);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11EncoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11EncoderTest.java
index 7adb804..4fa34a3 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11EncoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/LibertyHTTPSOAP11EncoderTest.java
@@ -52,26 +52,30 @@ public class LibertyHTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testResponseEncoding() throws Exception {
-        SAMLObjectBuilder<StatusCode> statusCodeBuilder = (SAMLObjectBuilder<StatusCode>) builderFactory
-                .getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
+        SAMLObjectBuilder<StatusCode> statusCodeBuilder =
+                (SAMLObjectBuilder<StatusCode>) builderFactory.<StatusCode>getBuilderOrThrow(
+                        StatusCode.DEFAULT_ELEMENT_NAME);
         StatusCode statusCode = statusCodeBuilder.buildObject();
         statusCode.setValue(StatusCode.SUCCESS);
 
-        SAMLObjectBuilder<Status> statusBuilder = (SAMLObjectBuilder<Status>) builderFactory
-                .getBuilder(Status.DEFAULT_ELEMENT_NAME);
+        SAMLObjectBuilder<Status> statusBuilder =
+                (SAMLObjectBuilder<Status>) builderFactory.<Status>getBuilderOrThrow(
+                        Status.DEFAULT_ELEMENT_NAME);
         Status responseStatus = statusBuilder.buildObject();
         responseStatus.setStatusCode(statusCode);
 
-        SAMLObjectBuilder<Response> responseBuilder = (SAMLObjectBuilder<Response>) builderFactory
-                .getBuilder(Response.DEFAULT_ELEMENT_NAME);
+        SAMLObjectBuilder<Response> responseBuilder =
+                (SAMLObjectBuilder<Response>) builderFactory.<Response>getBuilderOrThrow(
+                        Response.DEFAULT_ELEMENT_NAME);
         Response samlMessage = responseBuilder.buildObject();
         samlMessage.setID("foo");
         samlMessage.setVersion(SAMLVersion.VERSION_20);
         samlMessage.setIssueInstant(Instant.ofEpochMilli(0));
         samlMessage.setStatus(responseStatus);
 
-        SAMLObjectBuilder<Endpoint> endpointBuilder = (SAMLObjectBuilder<Endpoint>) builderFactory
-                .getBuilder(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
+        SAMLObjectBuilder<AssertionConsumerService> endpointBuilder =
+                (SAMLObjectBuilder<AssertionConsumerService>) builderFactory.<AssertionConsumerService>getBuilderOrThrow(
+                        AssertionConsumerService.DEFAULT_ELEMENT_NAME);
         Endpoint samlEndpoint = endpointBuilder.buildObject();
         samlEndpoint.setLocation("http://example.org");
         samlEndpoint.setResponseLocation("http://example.org/response");
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
index 9864dd8..d3626eb 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAttributeStatementToAssertionTest.java
@@ -137,7 +137,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         registry.initialize();
         
         action = new AddAttributeStatementToAssertion();
-        action.setTranscoderRegistry(new MockReloadableService(registry));
+        action.setTranscoderRegistry(new MockReloadableService<>(registry));
     }
 
     /** Test that the action errors out properly if there is no relying party context. */
@@ -199,14 +199,14 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
-        action.setTranscoderRegistry(new MockReloadableService(localregistry));
+        action.setTranscoderRegistry(new MockReloadableService<>(localregistry));
 
         final IdPAttribute attribute = new IdPAttribute(MY_NAME_1);
         attribute.setValues(Arrays.asList(new StringAttributeValue(MY_VALUE_1)));
 
         final AttributeContext attribCtx = new AttributeContext();
         attribCtx.setIdPAttributes(Arrays.asList(attribute));
-        ((RelyingPartyContext) prc.getSubcontext(RelyingPartyContext.class)).addSubcontext(attribCtx);
+        prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attribCtx);
 
         action.setIgnoringUnencodableAttributes(true);
         action.initialize();
@@ -235,14 +235,14 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
         localregistry.setTranscoderRegistry(Collections.singletonList(new TranscodingRule(rule)));
         localregistry.initialize();
         
-        action.setTranscoderRegistry(new MockReloadableService(localregistry));
+        action.setTranscoderRegistry(new MockReloadableService<>(localregistry));
 
         final IdPAttribute attribute = new IdPAttribute(MY_NAME_1);
         attribute.setValues(Arrays.asList(new StringAttributeValue(MY_VALUE_1)));
 
         final AttributeContext attribCtx = new AttributeContext();
         attribCtx.setIdPAttributes(Arrays.asList(attribute));
-        ((RelyingPartyContext) prc.getSubcontext(RelyingPartyContext.class)).addSubcontext(attribCtx);
+        prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attribCtx);
 
         action.setIgnoringUnencodableAttributes(false);
         action.initialize();
@@ -260,7 +260,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
                 SAML2ActionTestingSupport.buildAssertion());
 
         final AttributeContext attribCtx = buildAttributeContext();
-        ((RelyingPartyContext) prc.getSubcontext(RelyingPartyContext.class)).addSubcontext(attribCtx);
+        prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attribCtx);
 
         action.setStatementInOwnAssertion(true);
         action.initialize();
@@ -287,7 +287,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
                 SAML2ActionTestingSupport.buildAssertion());
 
         final AttributeContext attribCtx = buildAttributeContext();
-        ((RelyingPartyContext) prc.getSubcontext(RelyingPartyContext.class)).addSubcontext(attribCtx);
+        prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attribCtx);
 
         action.initialize();
         final Event result = action.execute(rc);
@@ -310,7 +310,7 @@ public class AddAttributeStatementToAssertionTest extends OpenSAMLInitBaseTestCa
      */
     @Test public void testNoAssertionInResponse() throws Exception {
         final AttributeContext attribCtx = buildAttributeContext();
-        ((RelyingPartyContext) prc.getSubcontext(RelyingPartyContext.class)).addSubcontext(attribCtx);
+        prc.getSubcontext(RelyingPartyContext.class).addSubcontext(attribCtx);
 
         action.initialize();
         final Event result = action.execute(rc);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
index 8539242..addfa41 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
@@ -68,8 +68,7 @@ public class FilterByQueriedAttributesTest extends XMLObjectBaseTestCase {
 
     protected <Type> Type getBean(String fileName, Class<Type> claz) {
 
-        GenericApplicationContext context = new GenericApplicationContext();
-        try {
+        try (final GenericApplicationContext context = new GenericApplicationContext()) {
             SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
                     new SchemaTypeAwareXMLBeanDefinitionReader(context);
     
@@ -82,13 +81,11 @@ public class FilterByQueriedAttributesTest extends XMLObjectBaseTestCase {
             Assert.assertEquals(beans.size(), 1);
     
             return beans.iterator().next();
-        } finally {
-            context.close();
         }
     }
         
     @BeforeClass public void setup() {
-        registry = new MockReloadableService(getBean(PATH + "saml2Mapper.xml", AttributeTranscoderRegistryImpl.class));
+        registry = new MockReloadableService<>(getBean(PATH + "saml2Mapper.xml", AttributeTranscoderRegistryImpl.class));
     }
     
     @BeforeMethod public void setUpMethod() throws ComponentInitializationException, XMLParserException, UnmarshallingException {
diff --git a/idp-schema/.settings/org.eclipse.jdt.core.prefs b/idp-schema/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-schema/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-schema/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-session-api/.settings/org.eclipse.jdt.core.prefs b/idp-session-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-session-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-session-api/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/AbstractIdPSession.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/AbstractIdPSession.java
index 2f02cf6..78b7b6e 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/AbstractIdPSession.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/AbstractIdPSession.java
@@ -114,8 +114,8 @@ public abstract class AbstractIdPSession implements IdPSession {
         creationInstant = Constraint.isNotNull(creationTime, "Creation time cannot be null");
         lastActivityInstant = creationTime;
 
-        authenticationResults = new ConcurrentHashMap(5);
-        spSessions = new ConcurrentHashMap(10);
+        authenticationResults = new ConcurrentHashMap<>(5);
+        spSessions = new ConcurrentHashMap<>(10);
     }
 
     /** {@inheritDoc} */
@@ -277,9 +277,8 @@ public abstract class AbstractIdPSession implements IdPSession {
         // Record may be actually present, or not yet loaded.
         if (authenticationResults.remove(result.getAuthenticationFlowId(), Optional.of(result))) {
             return true;
-        } else {
-            return authenticationResults.remove(result.getAuthenticationFlowId(), Optional.absent());
         }
+        return authenticationResults.remove(result.getAuthenticationFlowId(), Optional.absent());
     }
 
     /** {@inheritDoc} */
@@ -346,9 +345,8 @@ public abstract class AbstractIdPSession implements IdPSession {
         // Record may be actually present, or not yet loaded.
         if (spSessions.remove(spSession.getId(), Optional.of(spSession))) {
             return true;
-        } else {
-            return spSessions.remove(spSession.getId(), Optional.absent());
         }
+        return spSessions.remove(spSession.getId(), Optional.absent());
     }
 
     /** {@inheritDoc} */
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/SPSessionSerializerRegistry.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/SPSessionSerializerRegistry.java
index b443383..fc20435 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/SPSessionSerializerRegistry.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/SPSessionSerializerRegistry.java
@@ -73,23 +73,22 @@ public final class SPSessionSerializerRegistry extends AbstractInitializableComp
     /**
      * Get a registered {@link StorageSerializer} for a given {@link SPSession} type, if any.
      * 
+     * @param <T> type of SPSession
      * @param type a type of SPSession
      * @return a corresponding StorageSerializer, or null
      */
-    @Nullable public StorageSerializer<? extends SPSession> lookup(
-            @Nonnull final Class<? extends SPSession> type) {
+    @Nullable public <T extends SPSession> StorageSerializer<T> lookup(@Nonnull final Class<T> type) {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         Constraint.isNotNull(type, "SPSession type cannot be null");
         
-        final StorageSerializer<? extends SPSession> serializer = registry.get(type);
+        final StorageSerializer<T> serializer = (StorageSerializer<T>) registry.get(type);
         if (serializer != null) {
             log.debug("Registry located StorageSerializer of type '{}' for SPSession type '{}'",
                     serializer.getClass().getName(), type);
             return serializer;
-        } else {
-            log.debug("Registry failed to locate StorageSerializer for SPSession type '{}'", type);
-            return null;
         }
+        log.debug("Registry failed to locate StorageSerializer for SPSession type '{}'", type);
+        return null;
     }
 
 }
\ No newline at end of file
diff --git a/idp-session-impl/.settings/org.eclipse.jdt.core.prefs b/idp-session-impl/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-session-impl/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-session-impl/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateLogoutPropagationContext.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateLogoutPropagationContext.java
index 6dbdcbf..39a0017 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateLogoutPropagationContext.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateLogoutPropagationContext.java
@@ -161,11 +161,10 @@ public class PopulateLogoutPropagationContext extends AbstractProfileAction {
             if (session != null) {
                 log.debug("{} Got session to propagate logout: {}", getLogPrefix(), session);
                 return true;
-            } else {
-                log.debug("{} No sessions remaining for logout propagation", getLogPrefix());
-                ActionSupport.buildEvent(profileRequestContext, SESSION_NOT_FOUND);
-                return false;
             }
+            log.debug("{} No sessions remaining for logout propagation", getLogPrefix());
+            ActionSupport.buildEvent(profileRequestContext, SESSION_NOT_FOUND);
+            return false;
         }
 
         final RequestContext requestContext = getRequestContext(profileRequestContext);
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedIdPSession.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedIdPSession.java
index e82c7c5..0efab2d 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedIdPSession.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedIdPSession.java
@@ -95,9 +95,8 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
         } catch (final IOException e) {
             if (!sessionManager.isMaskStorageFailure()) {
                 throw new SessionException("Exception updating expiration of session record", e);
-            } else {
-                log.error("Exception updating expiration of master record for session {}", getId(), e);
             }
+            log.error("Exception updating expiration of master record for session {}", getId(), e);
         }
     }
     
@@ -126,15 +125,13 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
                     // The same address type is now set, so recheck. No need to update storage regardless.
                     if (nowBound.equals(address)) {
                         return;
-                    } else {
-                        log.warn("Client address is {} but session {} already bound to {}", address, getId(), nowBound);
-                        throw new SessionException("A different address of the same type was bound to the session");
                     }
-                } else {
-                    // We're still clear, so update ourselves again and try to write back.
-                    super.bindToAddress(address);
-                    success = writeToStorage();
+                    log.warn("Client address is {} but session {} already bound to {}", address, getId(), nowBound);
+                    throw new SessionException("A different address of the same type was bound to the session");
                 }
+                // We're still clear, so update ourselves again and try to write back.
+                super.bindToAddress(address);
+                success = writeToStorage();
             }
             if (!success) {
                 log.error("Exhausted retry attempts updating record for session {}", getId());
@@ -142,9 +139,8 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
         } catch (final IOException e) {
             if (!sessionManager.isMaskStorageFailure()) {
                 throw new SessionException("Exception updating address binding of session record", e);
-            } else {
-                log.error("Exception updating address binding of master record for session {}", getId(), e);
             }
+            log.error("Exception updating address binding of master record for session {}", getId(), e);
         }
     }
 
@@ -238,10 +234,9 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
         } catch (final IOException e) {
             if (!sessionManager.isMaskStorageFailure()) {
                 throw new SessionException("Exception saving AuthenticationResult record to storage", e);
-            } else {
-                log.error("Exception saving AuthenticationResult record for session {} and flow {}", getId(),
-                        result.getAuthenticationFlowId(), e);
             }
+            log.error("Exception saving AuthenticationResult record for session {} and flow {}", getId(),
+                    result.getAuthenticationFlowId(), e);
             return null;
         }
     }
@@ -262,10 +257,9 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
             } catch (final IOException e) {
                 if (!sessionManager.isMaskStorageFailure()) {
                     throw new SessionException("Exception updating AuthenticationResult expiration in storage", e);
-                } else {
-                    log.error("Exception updating AuthenticationResult expiration for session {} and flow {}", getId(),
-                            flowId, e);
                 }
+                log.error("Exception updating AuthenticationResult expiration for session {} and flow {}", getId(),
+                        flowId, e);
             }
         } else {
             log.warn("No flow descriptor installed for ID {}, unable to update result in storage", flowId);
@@ -282,10 +276,9 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
             } catch (final IOException e) {
                 if (!sessionManager.isMaskStorageFailure()) {
                     throw new SessionException("Exception removing AuthenticationResult record from storage", e);
-                } else {
-                    log.error("Exception removing AuthenticationResult record for session {} and flow {}", getId(),
-                            result.getAuthenticationFlowId(), e);
                 }
+                log.error("Exception removing AuthenticationResult record for session {} and flow {}", getId(),
+                        result.getAuthenticationFlowId(), e);
             }
             
             // Try and update the master record with the updated flow list.
@@ -309,15 +302,13 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
                 if (!sessionManager.isMaskStorageFailure()) {
                     throw new SessionException(
                             "Exception updating session record after AuthenticationResult removal", e);
-                } else {
-                    log.error("Exception updating record for session {}", getId(), e);
                 }
+                log.error("Exception updating record for session {}", getId(), e);
             }
             // If we reach here and a problem occurred, we must be masking storage problems.
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
 
     /** {@inheritDoc} */
@@ -378,9 +369,8 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
                 // An exception implies the record *might* still be accessible later.
             }
             return result;
-        } else {
-            return null;
         }
+        return null;
     }
     
 // Checkstyle: CyclomaticComplexity OFF
@@ -427,16 +417,14 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
             } catch (final IOException e) {
                 if (!sessionManager.isMaskStorageFailure()) {
                     throw new SessionException("Exception saving SPSession record to storage", e);
-                } else {
-                    log.error("Exception saving SPSession record for IdP session {} and service {}", getId(),
-                            spSession.getId(), e);
                 }
+                log.error("Exception saving SPSession record for IdP session {} and service {}", getId(),
+                        spSession.getId(), e);
                 return null;
             }
-        } else {
-            log.debug("Ignoring SPSession add, session manager is not configured to track them");
-            return null;
         }
+        log.debug("Ignoring SPSession add, session manager is not configured to track them");
+        return null;
     }
  // Checkstyle: CyclomaticComplexity ON
 
@@ -476,15 +464,13 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
                 if (!sessionManager.isMaskStorageFailure()) {
                     throw new SessionException(
                             "Exception updating session record after SPSession removal", e);
-                } else {
-                    log.error("Exception updating record for session {}", getId(), e);
                 }
+                log.error("Exception updating record for session {}", getId(), e);
             }
             // If we reach here and a problem occurred, we must be masking storage problems.
             return true;
-        } else {
-            return false;
         }
+        return false;
     }
     
     /** {@inheritDoc} */
@@ -492,9 +478,8 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
     public boolean checkTimeout() throws SessionException {
         if (getLastActivityInstant().plus(sessionManager.getSessionTimeout()).isAfter(Instant.now())) {
             return super.checkTimeout();
-        } else {
-            return false;
         }
+        return false;
     }
 
     /**
@@ -550,10 +535,9 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
             final StorageRecord<AuthenticationResult> record = sessionManager.getStorageService().read(getId(), flowId);
             if (record != null) {
                 return record.getValue(flow, getId(), flowId);
-            } else {
-                log.debug("No AuthenticationResult for flow {} in session {}", flowId, getId());
-                return null;
             }
+            log.debug("No AuthenticationResult for flow {} in session {}", flowId, getId());
+            return null;
         } catch (final IOException e) {
             log.error("Exception loading AuthenticationResult for flow {} from storage", flowId, e);
             throw e;
@@ -669,8 +653,9 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
         log.debug("Saving SPSession for service {} in session {}", session.getId(), getId());
 
         // Look up the serializer instance for that class type.
-        final StorageSerializer spSessionSerializer =
-                sessionManager.getSPSessionSerializerRegistry().lookup(session.getClass());
+        final StorageSerializer<SPSession> spSessionSerializer =
+                (StorageSerializer<SPSession>) sessionManager.getSPSessionSerializerRegistry().lookup(
+                        session.getClass());
         if (spSessionSerializer == null) {
             throw new IOException("No serializer registered for SPSession type " + session.getClass().getName());
         }
@@ -718,9 +703,8 @@ public class StorageBackedIdPSession extends AbstractIdPSession {
     @Nonnull @NotEmpty private String getSPSessionStorageKey(@Nonnull @NotEmpty final String serviceId) {
         if (serviceId.length() > sessionManager.getStorageService().getCapabilities().getKeySize()) {
             return DigestUtils.sha256Hex(serviceId);
-        } else {
-            return serviceId;
         }
+        return serviceId;
     }
     
     /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
index f7788dd..57d2bb0 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
@@ -174,7 +174,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
         sessionTimeout = Duration.ofHours(1);
         sessionSlop = Duration.ZERO;
         serializer = new StorageBackedIdPSessionSerializer(this, null);
-        flowDescriptorMap = new HashMap();
+        flowDescriptorMap = new HashMap<>();
         consistentAddress = true;
         cookieName = DEFAULT_COOKIE_NAME;
         storageServiceThreshold = 1024 * 1024;
@@ -582,9 +582,8 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
                         }
                     }
                     return ImmutableList.of();
-                } else {
-                    throw new ResolverException("HttpServletRequest is null");
                 }
+                throw new ResolverException("HttpServletRequest is null");
             }
 
             final SessionIdCriterion sessionIdCriterion = criteria.get(SessionIdCriterion.class);
@@ -592,9 +591,8 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
                 final IdPSession session = lookupBySessionId(sessionIdCriterion.getSessionId());
                 if (session != null) {
                     return ImmutableList.of(session);
-                } else {
-                    return ImmutableList.of();
                 }
+                return ImmutableList.of();
             }
 
             final SPSessionCriterion serviceCriterion = criteria.get(SPSessionCriterion.class);
@@ -657,7 +655,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
                 serviceKey = serviceKey.substring(0, keySize);
             }
 
-            StorageRecord sessionList = null;
+            StorageRecord<?> sessionList = null;
 
             try {
                 sessionList = storageService.read(serviceId, serviceKey);
@@ -736,7 +734,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
                 serviceKey = serviceKey.substring(0, keySize);
             }
 
-            StorageRecord sessionList = null;
+            StorageRecord<?> sessionList = null;
 
             try {
                 sessionList = storageService.read(serviceId, serviceKey);
@@ -802,9 +800,8 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
                     storageService.read(sessionId, SESSION_MASTER_KEY);
             if (sessionRecord != null) {
                 return sessionRecord.getValue(serializer, sessionId, SESSION_MASTER_KEY);
-            } else {
-                log.debug("Primary lookup failed for session ID {}", sessionId);
             }
+            log.debug("Primary lookup failed for session ID {}", sessionId);
         } catch (final IOException e) {
             log.error("Exception while querying for session ID {}", sessionId, e);
             if (!maskStorageFailure) {
@@ -841,7 +838,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
             serviceKey = serviceKey.substring(0, keySize);
         }
 
-        StorageRecord sessionList = null;
+        StorageRecord<?> sessionList = null;
 
         try {
             sessionList = storageService.read(serviceId, serviceKey);
@@ -857,7 +854,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
             return ImmutableList.of();
         }
 
-        final ImmutableList.Builder builder = ImmutableList.<IdPSession> builder();
+        final ImmutableList.Builder<IdPSession> builder = ImmutableList.builder();
 
         final StringBuilder writeBackSessionList = new StringBuilder(sessionList.getValue().length());
 
diff --git a/idp-ui/.settings/org.eclipse.jdt.core.prefs b/idp-ui/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-ui/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-ui/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
index f18b183..94edf2a 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/impl/SetRPUIInformation.java
@@ -150,7 +150,7 @@ public class SetRPUIInformation extends AbstractProfileAction {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         if (langs != null) {
-            fallbackLanguages = new ArrayList(Collections2.filter(langs, Predicates.notNull()));
+            fallbackLanguages = new ArrayList<>(Collections2.filter(langs, Predicates.notNull()));
         } else {
             fallbackLanguages = null;
         }
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
index 326e214..ca3eab3 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceContactTag.java
@@ -97,15 +97,13 @@ public class ServiceContactTag extends ServiceTagSupport {
             // Nonempty email. Construct an href
             log.debug("constructing hyperlink from name '{}' and email '{}'", name, email);
             return buildHyperLink(email, name);
-        } else {
-            log.debug("no email found, using name '{}' with no hyperlink", name);
+        }
+        log.debug("no email found, using name '{}' with no hyperlink", name);
 
-            if (null == name) {
-                return name;
-            } else {
-                return HTMLEncoder.encodeForHTML(name);
-            }
+        if (null != name) {
+            return HTMLEncoder.encodeForHTML(name);
         }
+        return null;
     }
 
     /**
diff --git a/idp-war/.settings/org.eclipse.jdt.core.prefs b/idp-war/.settings/org.eclipse.jdt.core.prefs
index 6063eee..7fa508c 100644
--- a/idp-war/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-war/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
 org.eclipse.jdt.core.codeComplete.fieldPrefixes=
@@ -10,22 +19,38 @@ org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
 org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
 org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
 org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
 org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
 org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
@@ -33,45 +58,79 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
 org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
 org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
 org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
 org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
 org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
 org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
 org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
 org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
 org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
 org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
 org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
 org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
 org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
 org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
 org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
 org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
 org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
 org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedImport=warning
 org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
 org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=11
@@ -350,3 +409,5 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error

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


More information about the commits mailing list