[java-identity-provider] branch master updated: IDP-1405 - Remove use of Guava Function/Predicate interfaces

Scott Cantor cantor.2 at osu.edu
Tue Feb 5 10:48:48 EST 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=5065b131ab0c9674801d5816aa2c780ae307bdb8

The following commit(s) were added to refs/heads/master by this push:
       new  5065b13   IDP-1405 - Remove use of Guava Function/Predicate interfaces
5065b13 is described below

commit 5065b131ab0c9674801d5816aa2c780ae307bdb8
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Fri Feb 1 16:26:50 2019 -0500

    IDP-1405 - Remove use of Guava Function/Predicate interfaces
    
    https://issues.shibboleth.net/jira/browse/IDP-1405
---
 .../admin/BasicAdministrativeFlowDescriptor.java   |  14 +--
 .../.settings/org.eclipse.jdt.core.prefs           |   4 +
 .../shibboleth/idp/attribute/AttributeEncoder.java |   5 +-
 .../net/shibboleth/idp/attribute/IdPAttribute.java |   4 +-
 .../net/shibboleth/idp/attribute/MockEncoder.java  |   6 +-
 .../filter/context/AttributeFilterContext.java     |   6 +-
 .../attribute/filter/impl/AttributeFilterImpl.java |   7 +-
 .../filter/matcher/impl/ScriptedMatcher.java       |  13 ++-
 .../impl/MappedAttributeInMetadataMatcher.java     |   8 +-
 .../filtercontext/impl/PredicatePolicyRule.java    |  14 ++-
 .../filter/policyrule/impl/ScriptedPolicyRule.java |  13 ++-
 .../AttributeRequesterInEntityGroupPolicyRule.java |   5 +-
 .../impl/BaseComplexAttributeFilterTestCase.java   |  14 +--
 .../matcher/impl/MockValuePredicateMatcher.java    |   6 +-
 .../impl/PredicatePolicyRuleTest.java              |  10 +-
 .../impl/AttributeFilterServiceStrategy.java       |   6 +-
 .../spring/BaseAttributeFilterParserTest.java      |  14 +--
 .../spring/policy/PredicateRuleParserTest.java     |   8 +-
 .../resolver/AbstractAttributeDefinition.java      |   1 -
 .../attribute/resolver/AbstractResolverPlugin.java |  10 +-
 .../resolver/ResolvedAttributeDefinition.java      |   3 +-
 .../attribute/resolver/ResolvedDataConnector.java  |   3 +-
 .../idp/attribute/resolver/ResolverPlugin.java     |   3 +-
 .../AbstractAttributeResolutionLookupFunction.java |   4 +-
 .../resolver/logic/AttributeIssuerIdPredicate.java |   3 +-
 .../logic/AttributePrincipalPredicate.java         |   3 +-
 .../logic/AttributeRecipientIdPredicate.java       |   3 +-
 .../resolver/AbstractResolverPluginTest.java       |   4 +-
 .../attribute/resolver/MockAttributeEncoder.java   |   6 +-
 .../ad/impl/ContextDerivedAttributeDefinition.java |  15 ++-
 .../impl/IdPAttributePrincipalValuesFunction.java  |   5 +-
 .../ad/impl/ScriptedAttributeDefinition.java       |  11 +--
 .../SubjectDerivedAttributeValuesFunction.java     |  21 ++--
 .../resolver/ad/mapped/impl/ValueMap.java          |   6 +-
 .../resolver/dc/impl/ScriptedDataConnector.java    |   3 +-
 .../resolver/impl/AttributeResolverImpl.java       |   2 +-
 .../resolver/ad/impl/ScriptedAttributeTest.java    |   5 +-
 .../dc/impl/SAMLAttributeDataConnector.java        |   3 +-
 .../dc/impl/SAMLAttributeDataConnectorTest.java    |   3 +-
 .../impl/AttributeResolutionContextTest.java       |   9 +-
 .../impl/AbstractResolverPluginFactoryBean.java    |   5 +-
 .../impl/AttributeResolverServiceStrategy.java     |   6 +-
 .../resolver/spring/AttributeResolverTest.java     |   6 +-
 ...SAML1StringNameIdentifierEncoderParserTest.java |   2 +-
 .../enc/SAML2StringAttributeEncoderParserTest.java |   6 +-
 .../idp/authn/AbstractAuthenticationAction.java    |   6 +-
 .../AbstractSubjectCanonicalizationAction.java     |   7 +-
 .../idp/authn/AbstractValidationAction.java        |  14 +--
 .../idp/authn/AuthenticationFlowDescriptor.java    |   6 +-
 .../authn/MultiFactorAuthenticationTransition.java |   3 +-
 .../SubjectCanonicalizationFlowDescriptor.java     |   9 +-
 .../idp/authn/context/AuthenticationContext.java   |   2 +-
 .../authn/context/RequestedPrincipalContext.java   |   2 +-
 .../DefaultPrincipalDeterminationStrategy.java     |   3 +-
 .../authn/principal/PrincipalEvalPredicate.java    |   3 +-
 .../principal/PrincipalEvalPredicateFactory.java   |   4 +-
 .../SubjectCanonicalizationFlowDescriptorTest.java |   4 +-
 .../impl/AuthenticationFlowAuditExtractor.java     |   5 +-
 .../impl/ExtractDuoAuthenticationFromHeaders.java  |   3 +-
 .../idp/authn/duo/impl/ValidateDuoAuthAPI.java     |   3 +-
 .../idp/authn/duo/impl/ValidateDuoWebResponse.java |   2 +-
 .../AttributeSourcedSubjectCanonicalization.java   |  10 +-
 .../idp/authn/impl/ExternalAuthenticationImpl.java |   3 +-
 .../idp/authn/impl/FilterFlowsByAttribute.java     |   9 +-
 .../idp/authn/impl/FinalizeAuthentication.java     |   3 +-
 .../impl/FinalizeMultiFactorAuthentication.java    |  14 ++-
 .../impl/InitializeRequestedPrincipalContext.java  |   3 +-
 .../authn/impl/PopulateAuthenticationContext.java  |   6 +-
 .../PopulateMultiFactorAuthenticationContext.java  |  12 +--
 .../idp/authn/impl/SelectAuthenticationFlow.java   |  24 ++---
 .../impl/SelectSubjectCanonicalizationFlow.java    |   2 +-
 .../authn/impl/SimpleSubjectCanonicalization.java  |   6 +-
 .../impl/StorageBackedAccountLockoutManager.java   |   3 +-
 .../impl/TransitionMultiFactorAuthentication.java  |  13 ++-
 .../idp/authn/impl/ValidateFunctionResult.java     |   3 +-
 .../impl/ValidateUsernamePasswordAgainstJAAS.java  |   8 +-
 .../authn/impl/X500SubjectCanonicalization.java    |   5 +-
 .../impl/ExactPrincipalEvalPredicateFactory.java   |   2 +-
 .../impl/InexactPrincipalEvalPredicateFactory.java |   2 +-
 .../ExactPrincipalEvalPredicateFactoryTest.java    |  10 +-
 .../InexactPrincipalEvalPredicateFactoryTest.java  |  32 +++---
 .../cas/ticket/TicketPrincipalLookupFunction.java  |  21 ++--
 .../idp/cas/audit/impl/GatewayLookupFunction.java  |  22 ++---
 .../impl/ProxyGrantingTicketLookupFunction.java    |  18 ++--
 .../idp/cas/audit/impl/RenewLookupFunction.java    |  15 +--
 .../idp/cas/audit/impl/ServiceLookupFunction.java  |  16 +--
 .../cas/audit/impl/StatusCodeLookupFunction.java   |  18 ++--
 .../cas/audit/impl/StatusDetailLookupFunction.java |  17 ++--
 .../idp/cas/audit/impl/TicketLookupFunction.java   |  16 +--
 .../config/impl/AbstractProtocolConfiguration.java |   6 +-
 .../idp/cas/config/impl/ConfigLookupFunction.java  |   9 +-
 .../idp/cas/config/impl/LoginConfiguration.java    |   4 +-
 .../idp/cas/config/impl/ValidateConfiguration.java |   3 +-
 .../cas/flow/impl/AbstractCASProtocolAction.java   |   5 +-
 .../impl/BuildAuthenticationContextAction.java     |   2 +-
 .../flow/impl/BuildRelyingPartyContextAction.java  |  16 ++-
 .../idp/cas/flow/impl/GrantProxyTicketAction.java  |   5 +-
 .../cas/flow/impl/GrantServiceTicketAction.java    |  16 +--
 .../PrepareTicketValidationResponseAction.java     |  17 ++--
 .../cas/proxy/impl/HttpClientProxyValidator.java   |  24 ++---
 .../cas/service/impl/MetadataServiceRegistry.java  |   7 +-
 .../impl/BuildSAMLMetadataContextActionTest.java   |   2 +-
 idp-conf/src/main/resources/conf/cas-protocol.xml  |   4 +-
 .../conf/intercept/consent-intercept-config.xml    |   3 +-
 idp-conf/src/main/resources/conf/logback.xml       |   6 +-
 .../main/resources/system/conf/audit-system.xml    | 110 ++++++++++-----------
 .../resources/system/conf/cas-protocol-system.xml  |   4 +-
 .../main/resources/system/conf/global-system.xml   |   2 +
 .../system/conf/profile-intercept-system.xml       |   5 +-
 .../resources/system/conf/subject-c14n-system.xml  |   4 +-
 .../src/main/resources/system/conf/utilities.xml   |  24 +++--
 .../system/flows/admin/admin-abstract-beans.xml    |   4 +-
 .../resources/system/flows/admin/mdquery-beans.xml |   3 +-
 .../resources/system/flows/admin/metrics-beans.xml |   3 +-
 .../system/flows/admin/reload-metadata-beans.xml   |   3 +-
 .../system/flows/admin/reload-service-beans.xml    |   3 +-
 .../system/flows/admin/resolvertest-beans.xml      |   7 +-
 .../resources/system/flows/admin/status-beans.xml  |   6 +-
 .../system/flows/admin/unlock-keys-beans.xml       |   6 +-
 .../resources/system/flows/authn/authn-beans.xml   |   4 +-
 .../system/flows/authn/duo-authn-beans.xml         |   8 +-
 .../system/flows/authn/external-authn-beans.xml    |   5 +-
 .../system/flows/authn/mfa-authn-beans.xml         |   4 +-
 .../system/flows/authn/remoteuser-authn-beans.xml  |   5 +-
 .../system/flows/authn/spnego-authn-beans.xml      |   5 +-
 .../system/flows/authn/x509-authn-beans.xml        |   5 +-
 .../c14n/attribute-sourced-subject-c14n-beans.xml  |   2 +-
 .../system/flows/cas/login/login-beans.xml         |   8 +-
 .../flows/intercept/attribute-release-beans.xml    |   5 +-
 .../flows/intercept/attribute-release-flow.xml     |   4 +-
 .../intercept/attribute-release-query-beans.xml    |   4 +-
 .../intercept/attribute-release-query-flow.xml     |   2 +-
 .../system/flows/intercept/context-check-flow.xml  |   2 +-
 .../flows/intercept/expiring-password-flow.xml     |   2 +-
 .../system/flows/intercept/impersonate-beans.xml   |   2 +-
 .../system/flows/intercept/terms-of-use-beans.xml  |   5 +-
 .../system/flows/intercept/terms-of-use-flow.xml   |   2 +-
 .../resources/system/flows/logout/logout-beans.xml |   8 +-
 .../resources/system/flows/logout/logout-flow.xml  |   2 +-
 .../flows/logout/propagation/saml2-beans.xml       |   2 +-
 .../system/flows/saml/saml-abstract-beans.xml      |   6 +-
 .../flows/saml/saml1/attribute-query-beans.xml     |   2 +-
 .../system/flows/saml/saml1/sso-abstract-flow.xml  |   4 +-
 .../flows/saml/saml2/attribute-query-beans.xml     |   2 +-
 .../system/flows/saml/saml2/common-beans.xml       |   6 +-
 .../system/flows/saml/saml2/idwsf-ssos-beans.xml   |   8 +-
 .../flows/saml/saml2/idwsf-ssos-security-beans.xml |   4 +-
 .../system/flows/saml/saml2/slo-back-beans.xml     |   2 +-
 .../flows/saml/saml2/slo-front-abstract-beans.xml  |  10 +-
 .../flows/saml/saml2/slo-front-abstract-flow.xml   |   6 +-
 .../system/flows/saml/saml2/sso-abstract-beans.xml |   2 +-
 .../system/flows/saml/saml2/sso-abstract-flow.xml  |   6 +-
 .../resources/system/flows/saml/security-beans.xml |   2 +-
 .../idp/test/flows/cas/ToggleablePredicate.java    |   6 +-
 .../intercept/flows/test-intercept-beans.xml       |   2 +-
 .../src/test/resources/test/override-beans.xml     |   4 +-
 .../impl/CurrentConsentIdsAuditExtractor.java      |   7 +-
 .../CurrentConsentIsApprovedAuditExtractor.java    |  20 ++--
 .../impl/CurrentConsentValuesAuditExtractor.java   |  20 ++--
 .../ar/impl/AbstractAttributeReleaseAction.java    |  19 ++--
 .../ar/impl/AttributeReleaseFlowDescriptor.java    |   3 +-
 .../ar/impl/PopulateAttributeReleaseContext.java   |   5 +-
 .../consent/flow/impl/AbstractConsentAction.java   |   8 +-
 .../consent/flow/impl/PopulateConsentContext.java  |   3 +-
 .../impl/AbstractConsentIndexedStorageAction.java  |   3 +-
 .../storage/impl/AbstractConsentStorageAction.java |   8 +-
 .../impl/AbstractAttributeDisplayFunction.java     |   6 +-
 .../impl/AttributeDisplayDescriptionFunction.java  |   5 +-
 .../logic/impl/AttributeDisplayNameFunction.java   |   5 +-
 .../idp/consent/logic/impl/AttributePredicate.java |   6 +-
 .../impl/AttributeReleaseConsentFunction.java      |  16 ++-
 .../logic/impl/AttributeValueLookupFunction.java   |  11 +--
 .../logic/impl/AttributeValuesHashFunction.java    |   3 +-
 .../logic/impl/CounterStorageKeyFunction.java      |   8 +-
 .../logic/impl/FlowDescriptorLookupFunction.java   |   9 +-
 .../consent/logic/impl/FlowIdLookupFunction.java   |   2 +-
 .../impl/GlobalAttributeConsentPredicate.java      |   8 +-
 .../idp/consent/logic/impl/HashFunction.java       |   7 +-
 .../logic/impl/IsAttributeRequiredPredicate.java   |  25 ++---
 .../logic/impl/IsConsentRequiredPredicate.java     |  10 +-
 .../idp/consent/logic/impl/JoinFunction.java       |   6 +-
 .../consent/logic/impl/LocaleLookupFunction.java   |   4 +-
 .../logic/impl/MessageSourceConsentFunction.java   |   4 +-
 .../logic/impl/PreferExplicitOrderComparator.java  |   2 +-
 .../impl/AttributeReleaseFlowDescriptorTest.java   |   5 +-
 .../impl/PopulateAttributeReleaseContextTest.java  |   4 +-
 .../flow/impl/PopulateConsentContextTest.java      |  22 +----
 ...ttributeDisplayNameDescriptionFunctionTest.java |   2 +-
 .../consent/logic/impl/AttributePredicateTest.java |  60 +++++------
 .../idp/consent/logic/impl/JoinFunctionTest.java   |   4 +-
 .../storage/impl/ConsentSerializerTest.java        |   3 +-
 .../idp/profile/AbstractProfileAction.java         |   3 +-
 .../AbstractConditionalProfileConfiguration.java   |   3 +-
 .../config/AbstractProfileConfiguration.java       |   2 +-
 .../config/ConditionalProfileConfiguration.java    |   4 +-
 .../config/logic/DetailedErrorsPredicate.java      |   4 +-
 .../SelfEncryptionConfigurationLookupFunction.java |   3 +-
 .../idp/profile/context/RelyingPartyContext.java   |   4 +-
 .../AbstractRelyingPartyLookupFunction.java        |   4 +-
 .../RelyingPartyContextLookupByCurrent.java        |   1 -
 .../navigate/RelyingPartyContextLookupById.java    |   5 +-
 .../navigate/RelyingPartyContextLookupByLabel.java |   4 +-
 .../navigate/RelyingPartyIdLookupFunction.java     |   1 -
 .../navigate/ResponderIdLookupFunction.java        |   2 +-
 .../navigate/ScriptedContextLookupFunction.java    |   3 +-
 .../ServletRequestProfileRequestContextLookup.java |   7 +-
 .../navigate/SpringEventToViewLookupFunction.java  |   4 +-
 .../SpringExpressionContextLookupFunction.java     |   4 +-
 .../SpringStatusMessageLookupFunction.java         |   5 +-
 .../WebFlowCurrentEventLookupFunction.java         |   4 +-
 ...wRequestContextProfileRequestContextLookup.java |   5 +-
 .../AbstractRelyingPartyLookupFunction.java        |  12 +--
 .../AbstractProfileInterceptorAction.java          |   4 +-
 .../ProfileInterceptorFlowDescriptor.java          |   7 +-
 .../profile/logic/AbstractAttributePredicate.java  |  14 +--
 .../logic/AbstractRelyingPartyPredicate.java       |   6 +-
 .../profile/logic/DynamicAttributePredicate.java   |   5 +-
 .../idp/profile/logic/RelyingPartyIdPredicate.java |   3 +-
 .../idp/profile/logic/ScriptedPredicate.java       |   4 +-
 .../profile/logic/VerifiedProfilePredicate.java    |   2 +-
 .../messaging/AbstractRelyingPartyPredicate.java   |  14 ++-
 .../relyingparty/RelyingPartyConfiguration.java    |  10 +-
 .../ProfileInterceptorFlowDescriptorTest.java      |   4 +-
 .../RelyingPartyConfigurationTest.java             |   4 +-
 .../audit/impl/AttributesAuditExtractor.java       |  12 +--
 .../profile/audit/impl/PopulateAuditContext.java   |   3 +-
 .../idp/profile/audit/impl/WriteAuditLog.java      |   4 +-
 .../idp/profile/impl/FilterAttributes.java         |  43 ++++----
 .../idp/profile/impl/PopulateSubjectContext.java   |   5 +-
 .../profile/impl/ReloadServiceConfiguration.java   |   3 +-
 .../idp/profile/impl/ResolveAttributes.java        |  14 ++-
 .../profile/impl/ResolverTestPrincipalLookup.java  |   5 +-
 .../profile/impl/SelectProfileConfiguration.java   |   6 +-
 .../impl/SelectRelyingPartyConfiguration.java      |   4 +-
 .../profile/impl/WebFlowMessageHandlerAdaptor.java |   4 +-
 .../impl/PopulateProfileInterceptorContext.java    |  11 +--
 .../impl/SelectProfileInterceptorFlow.java         |   2 +-
 .../messaging/impl/SelectProfileConfiguration.java |  12 +--
 .../impl/SelectRelyingPartyConfiguration.java      |  12 +--
 .../DefaultRelyingPartyConfigurationResolver.java  |  10 +-
 .../audit/impl/PopulateAuditContextTest.java       |   3 +-
 .../impl/AbstractRelyingPartyParser.java           |   2 +-
 .../impl/AnonymousRelyingPartyParser.java          |   2 +-
 .../impl/DefaultRelyingPartyParser.java            |   2 +-
 .../relyingparty/impl/RelyingPartyParser.java      |  11 +--
 .../filter/impl/PredicateFilterParser.java         |  11 ++-
 .../impl/DynamicHTTPMetadataProviderParser.java    |   2 +-
 .../impl/MetadataResolverServiceStrategy.java      |   6 +-
 .../impl/AllowDelegationPredicateFactoryBean.java  |   3 +-
 .../impl/BaseSAMLProfileConfigurationParser.java   |   3 +-
 .../idp/profile/spring/logic/DummyPredicate.java   |   6 +-
 .../spring/relyingparty/RelyingPartyGroupTest.java |   2 +-
 .../spring/relyingparty/RelyingPartyTest.java      |   4 +-
 .../DynamicHTTPMetadataProviderParserTest.java     |   7 +-
 .../LocalDynamicMetadataProviderParserTest.java    |   2 +-
 .../metadata/ReloadServiceConfigurationTest.java   |  16 +--
 .../metadata/filter/PredicateFilterParserTest.java |  11 +--
 .../relyingparty/saml/BaseSAMLProfileTest.java     |  11 +--
 .../relyingparty/saml/SAML2SSOSProfileTest.java    |   4 +-
 .../AbstractSAML1NameIdentifierEncoder.java        |   3 +-
 .../encoding/AbstractSAML2NameIDEncoder.java       |   3 +-
 .../encoding/AbstractSAMLAttributeEncoder.java     |   2 +-
 .../profile/config/SSOSProfileConfiguration.java   |   3 +-
 .../nameid/NameIdentifierAttributeEncoder.java     |   4 +-
 ...tMetadataDrivenConfigurationLookupStrategy.java |  13 +--
 .../config/AbstractSAMLProfileConfiguration.java   |   6 +-
 .../SAMLArtifactConsumerProfileConfiguration.java  |   5 +-
 .../profile/config/SAMLProfileConfiguration.java   |   3 +-
 .../logic/AllowedSAMLPresentersPredicate.java      |   7 +-
 .../DetailedErrorsProfileConfigPredicate.java      |   5 +-
 .../logic/ForceAuthnProfileConfigPredicate.java    |   7 +-
 .../logic/IncludeAttributeStatementPredicate.java  |  14 ++-
 .../LegacyEncryptionRequirementPredicate.java      |   5 +-
 .../logic/LegacySigningRequirementPredicate.java   |   5 +-
 .../logic/NotBeforeProfileConfigPredicate.java     |   3 +-
 .../ResolveAttributesProfileConfigPredicate.java   |   7 +-
 .../config/logic/SignAssertionsPredicate.java      |   9 +-
 .../config/logic/SignRequestsPredicate.java        |   5 +-
 .../config/logic/SignResponsesPredicate.java       |   5 +-
 .../ClientTLSArtifactRequestsPredicate.java        |   5 +-
 .../ClientTLSSOAPLogoutRequestsPredicate.java      |   5 +-
 .../messaging/SignArtifactRequestsPredicate.java   |   5 +-
 .../messaging/SignSOAPLogoutRequestsPredicate.java |   5 +-
 .../navigate/AssertionLifetimeLookupFunction.java  |   1 -
 .../AudienceRestrictionsLookupFunction.java        |   1 -
 .../ProxyAudienceRestrictionsLookupFunction.java   |   1 -
 .../config/navigate/ProxyCountLookupFunction.java  |   1 -
 .../QualifiedNameIDFormatsLookupFunction.java      |   1 -
 .../navigate/SessionLifetimeLookupFunction.java    |   1 -
 .../SAMLMetadataContextLookupFunction.java         |   1 -
 .../SAMLMetadataContextLookupFunction.java         |   1 -
 .../logic/DefaultNameIdentifierFormatStrategy.java |   5 +-
 ...ractSAML1ArtifactAwareProfileConfiguration.java |   3 +-
 .../config/BrowserSSOProfileConfiguration.java     |   9 +-
 ...ractSAML2ArtifactAwareProfileConfiguration.java |   9 +-
 .../config/AbstractSAML2ProfileConfiguration.java  |   6 +-
 .../config/BrowserSSOProfileConfiguration.java     |  14 +--
 .../profile/config/ECPProfileConfiguration.java    |   2 +-
 .../profile/config/SAML2ProfileConfiguration.java  |   3 +-
 .../config/SingleLogoutProfileConfiguration.java   |  11 +--
 .../profile/config/logic/SOAPErrorPredicate.java   |   7 +-
 .../IssuingDelegatedAssertionPredicate.java        |   8 +-
 .../AbstractSAML1NameIdentifierEncoderTest.java    |   2 +-
 .../encoding/AbstractSAML2NameIDEncoderTest.java   |   2 +-
 .../config/SSOSProfileConfigurationTest.java       |   4 +-
 .../saml/saml1/profile/SAML1ActionSupportTest.java |   4 +-
 .../saml/saml2/profile/SAML2ActionSupportTest.java |   4 +-
 .../config/BrowserSSOProfileConfigurationTest.java |   2 +-
 .../impl/SAML1StringNameIdentifierEncoder.java     |   2 +-
 .../encoding/impl/SAML2StringNameIDEncoder.java    |   2 +-
 .../saml/audit/impl/AssertionIDAuditExtractor.java |  17 +---
 .../audit/impl/AssertionInstantAuditExtractor.java |  16 +--
 .../audit/impl/AuthnContextAuditExtractor.java     |   5 +-
 .../audit/impl/AuthnInstantAuditExtractor.java     |   5 +-
 .../saml/audit/impl/ForceAuthnAuditExtractor.java  |   5 +-
 .../audit/impl/InResponseToAuditExtractor.java     |   5 +-
 .../saml/audit/impl/IsPassiveAuditExtractor.java   |   5 +-
 .../idp/saml/audit/impl/NameIDAuditExtractor.java  |   5 +-
 .../audit/impl/NameIDFormatAuditExtractor.java     |   5 +-
 .../audit/impl/SessionIndexAuditExtractor.java     |   4 +-
 .../saml/audit/impl/StatusCodeAuditExtractor.java  |   5 +-
 .../audit/impl/StatusMessageAuditExtractor.java    |   5 +-
 .../audit/impl/SubStatusCodeAuditExtractor.java    |   4 +-
 .../idp/saml/audit/impl/WriteFTICKSLog.java        |  10 +-
 .../InitializeRelyingPartyContextFromSAMLPeer.java |  19 ++--
 ...tributeSourcedSAML1NameIdentifierGenerator.java |   9 +-
 .../impl/AttributeSourcedSAML2NameIDGenerator.java |   9 +-
 .../saml/nameid/impl/LegacyCanonicalization.java   |   5 +-
 .../nameid/impl/LegacyNameIdentifierGenerator.java |  16 +--
 .../saml/nameid/impl/NameIDCanonicalization.java   |   5 +-
 .../impl/NameIdentifierCanonicalization.java       |   5 +-
 .../impl/PersistentSAML2NameIDGenerator.java       |   9 +-
 .../TransientSAML1NameIdentifierGenerator.java     |   8 +-
 .../nameid/impl/TransientSAML2NameIDGenerator.java |   8 +-
 .../impl/BaseAddAttributeStatementToAssertion.java |   9 +-
 .../BaseAddAuthenticationStatementToAssertion.java |   4 +-
 .../profile/impl/ExtractSubjectFromRequest.java    |   7 +-
 .../impl/InitializeAuthenticationContext.java      |  12 +--
 .../impl/InitializeOutboundMessageContext.java     |   4 +-
 .../InitializeOutboundMessageContextForError.java  |   9 +-
 .../InitializeRelyingPartyContextFromSAMLPeer.java |   9 +-
 .../impl/PopulateBindingAndEndpointContexts.java   |  50 ++++------
 .../PopulateInboundMessageContextWithSAMLSelf.java |   4 +-
 .../impl/SAMLRelyingPartyIdLookupStrategy.java     |   1 -
 .../impl/SAMLVerificationLookupStrategy.java       |   1 -
 .../impl/RelyingPartyConfigurationSupport.java     |   6 +-
 .../impl/AddAttributeStatementToAssertion.java     |   5 +-
 .../AddAuthenticationStatementToAssertion.java     |   4 +-
 .../impl/FilterByQueriedAttributeDesignators.java  |   9 +-
 ...tementToAssertionFromInboundAssertionToken.java |   4 +-
 .../impl/AddDelegationPolicyToAssertion.java       |   7 +-
 .../impl/AddDelegationRestrictionToAssertions.java |  11 +--
 .../impl/DecorateDelegatedAssertion.java           |   7 +-
 .../impl/DelegatedAssertionLookupStrategy.java     |   9 +-
 .../delegation/impl/EvaluateDelegationPolicy.java  |  13 +--
 .../delegation/impl/PopulateDelegationContext.java |  11 +--
 .../delegation/impl/PopulateLibertyContext.java    |   8 +-
 .../impl/PopulateOutboundMessageContext.java       |   4 +-
 .../delegation/impl/ProcessDelegatedAssertion.java |  18 ++--
 .../messaging/impl/AddSenderHandler.java           |   9 +-
 .../impl/AddAttributeStatementToAssertion.java     |   4 +-
 .../profile/impl/AddAuthnStatementToAssertion.java |   3 +-
 .../profile/impl/FilterByQueriedAttributes.java    |  10 +-
 ...estedAttributesInAttributeConsumingService.java |  14 +--
 .../profile/impl/PopulateEncryptionParameters.java |  20 ++--
 .../saml2/profile/impl/ProcessLogoutRequest.java   |   5 +-
 .../profile/impl/ProcessRequestedAuthnContext.java |   7 +-
 .../saml/saml2/profile/impl/SOAPLogoutRequest.java |  25 +++--
 .../idp/saml/session/impl/AddLogoutRequest.java    |   4 +-
 .../session/impl/PrepareInboundMessageContext.java |   4 +-
 .../impl/SAML1SPSessionCreationStrategy.java       |   5 +-
 .../impl/SAML2SPSessionCreationStrategy.java       |   9 +-
 ...ntToAssertionFromInboundAssertionTokenTest.java |   7 +-
 .../impl/DecorateDelegatedAssertionTest.java       |  10 +-
 .../impl/EvaluateDelegationPolicyTest.java         |   8 +-
 .../impl/PopulateLibertyContextTest.java           |  12 +--
 .../messaging/impl/AddSenderHandlerTest.java       |  12 +--
 .../navigate/CanonicalUsernameLookupStrategy.java  |   5 +-
 .../navigate/SessionContextIDLookupFunction.java   |   1 -
 .../SessionContextPrincipalLookupFunction.java     |   1 -
 .../LogoutPropagationFlowDescriptorSelector.java   |   7 +-
 .../impl/BasicSPSessionCreationStrategy.java       |   7 +-
 .../idp/session/impl/DestroySessions.java          |   3 +-
 .../idp/session/impl/DetectIdentitySwitch.java     |   2 +-
 .../impl/ExtractActiveAuthenticationResults.java   |   3 +-
 .../session/impl/LogoutStatusStrategyFunction.java |   5 +-
 .../impl/PopulateLogoutPropagationContext.java     |   2 +-
 .../PopulateMultiRPContextFromLogoutContext.java   |   3 +-
 .../idp/session/impl/PopulateSessionContext.java   |  14 +--
 .../shibboleth/idp/session/impl/ProcessLogout.java |  14 +--
 .../impl/RestoreProfileRequestContextTree.java     |   3 +-
 .../idp/session/impl/SaveLogoutContext.java        |   3 +-
 .../impl/SaveProfileRequestContextTree.java        |   3 +-
 .../session/impl/SelectLogoutPropagationFlow.java  |   4 +-
 .../UpdateSessionWithAuthenticationResult.java     |   3 +-
 .../session/impl/UpdateSessionWithSPSession.java   |   3 +-
 .../impl/UpdateSessionWithSPSessionTest.java       |  19 +---
 .../shibboleth/idp/ui/impl/SetRPUIInformation.java |   8 +-
 .../idp/ui/taglib/ServiceTagSupport.java           |  12 +--
 399 files changed, 1245 insertions(+), 1624 deletions(-)

diff --git a/idp-admin-api/src/main/java/net/shibboleth/idp/admin/BasicAdministrativeFlowDescriptor.java b/idp-admin-api/src/main/java/net/shibboleth/idp/admin/BasicAdministrativeFlowDescriptor.java
index 29107e8..7f60eca 100644
--- a/idp-admin-api/src/main/java/net/shibboleth/idp/admin/BasicAdministrativeFlowDescriptor.java
+++ b/idp-admin-api/src/main/java/net/shibboleth/idp/admin/BasicAdministrativeFlowDescriptor.java
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -51,9 +53,7 @@ import org.opensaml.saml.ext.saml2mdui.InformationURL;
 import org.opensaml.saml.ext.saml2mdui.PrivacyStatementURL;
 import org.opensaml.saml.ext.saml2mdui.UIInfo;
 
-import com.google.common.base.Function;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
@@ -77,10 +77,10 @@ public class BasicAdministrativeFlowDescriptor extends AbstractProfileConfigurat
     @Nullable private String loggingId;
     
     /** Whether this flow supports non-browser clients. */
-    private Predicate<ProfileRequestContext> supportsNonBrowserPredicate;
+    @Nonnull private Predicate<ProfileRequestContext> supportsNonBrowserPredicate;
 
     /** Whether user authentication is required. */
-    private Predicate<ProfileRequestContext> authenticatedPredicate;
+    @Nonnull private Predicate<ProfileRequestContext> authenticatedPredicate;
     
     /** Expose user interface details. */
     @Nonnull private final UIInfo uiInfo;
@@ -138,7 +138,7 @@ public class BasicAdministrativeFlowDescriptor extends AbstractProfileConfigurat
     
     /** {@inheritDoc} */
     public boolean isNonBrowserSupported() {
-        return supportsNonBrowserPredicate.apply(getProfileRequestContext());
+        return supportsNonBrowserPredicate.test(getProfileRequestContext());
     }
 
     /**
@@ -162,7 +162,7 @@ public class BasicAdministrativeFlowDescriptor extends AbstractProfileConfigurat
     
     /** {@inheritDoc} */
     public boolean isAuthenticated() {
-        return authenticatedPredicate.apply(getProfileRequestContext());
+        return authenticatedPredicate.test(getProfileRequestContext());
     }
     
     /**
@@ -304,7 +304,7 @@ public class BasicAdministrativeFlowDescriptor extends AbstractProfileConfigurat
 
     /** {@inheritDoc} */
     public boolean resolveAttributes() {
-        return resolveAttributesPredicate.apply(getProfileRequestContext());
+        return resolveAttributesPredicate.test(getProfileRequestContext());
     }
 
     /**
diff --git a/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs b/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
index 6063eee..b20a886 100644
--- a/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
+++ b/idp-attribute-api/.settings/org.eclipse.jdt.core.prefs
@@ -74,7 +74,11 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disa
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.release=disabled
+<<<<<<< HEAD
 org.eclipse.jdt.core.compiler.source=11
+=======
+org.eclipse.jdt.core.compiler.source=1.8
+>>>>>>> Work in progress.
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeEncoder.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeEncoder.java
index 63f93da..f72b56b 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeEncoder.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/AttributeEncoder.java
@@ -17,13 +17,13 @@
 
 package net.shibboleth.idp.attribute;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 
 /**
@@ -67,4 +67,5 @@ public interface AttributeEncoder<EncodedType> {
      * @throws AttributeEncodingException if unable to successfully encode attribute
      */
     @Nonnull EncodedType encode(@Nonnull final IdPAttribute attribute) throws AttributeEncodingException;
+
 }
\ No newline at end of file
diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
index ba41d56..4f0e508 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/IdPAttribute.java
@@ -24,12 +24,12 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.NotThreadSafe;
 
-import com.google.common.base.Function;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicates;
@@ -189,7 +189,7 @@ public class IdPAttribute implements Comparable<IdPAttribute>, Cloneable {
      */
     public void setValues(@Nullable @NullableElements final Collection<? extends IdPAttributeValue<?>> newValues) {
         if (newValues != null) {
-            values = ImmutableList.copyOf(Collections2.transform(newValues, convertNullValues));
+            values = ImmutableList.copyOf(Collections2.transform(newValues, convertNullValues::apply));
         } else {
             values = ImmutableList.of();
         }
diff --git a/idp-attribute-api/src/test/java/net/shibboleth/idp/attribute/MockEncoder.java b/idp-attribute-api/src/test/java/net/shibboleth/idp/attribute/MockEncoder.java
index e0e15b5..69d089f 100644
--- a/idp-attribute-api/src/test/java/net/shibboleth/idp/attribute/MockEncoder.java
+++ b/idp-attribute-api/src/test/java/net/shibboleth/idp/attribute/MockEncoder.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.attribute;
 
+import java.util.function.Predicate;
+
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -52,19 +53,16 @@ public class MockEncoder<ValueType> implements AttributeEncoder<ValueType> {
     }
 
     /** {@inheritDoc} */
-    @Override
     public String getProtocol() {
         return proto;
     }
 
     /** {@inheritDoc} */
-    @Override
     public ValueType encode(IdPAttribute attribute) throws AttributeEncodingException {
         return encodedValue;
     }
     
     /** {@inheritDoc} */
-    @Override
     public Predicate<ProfileRequestContext> getActivationCondition() {
         return Predicates.alwaysTrue();
     }
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 09a86b9..62c5195 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -38,7 +39,6 @@ import org.opensaml.profile.context.ProxiedRequesterContext;
 import org.opensaml.saml.common.messaging.context.SAMLMetadataContext;
 import org.opensaml.saml.metadata.resolver.MetadataResolver;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /** A context supplying input to the {@link net.shibboleth.idp.attribute.filter.AttributeFilter} interface. */
@@ -46,10 +46,10 @@ import com.google.common.base.Predicates;
 public final class AttributeFilterContext extends BaseContext {
 
     /** Attributes which are to be filtered. */
-    @Nonnull private Map<String, IdPAttribute> prefilteredAttributes;
+    @Nonnull private Map<String,IdPAttribute> prefilteredAttributes;
 
     /** Attributes which have been filtered. */
-    @Nonnull private Map<String, IdPAttribute> filteredAttributes;
+    @Nonnull private Map<String,IdPAttribute> filteredAttributes;
 
     /** Optional, supplemental metadata resolver. */
     @Nullable private MetadataResolver metadataResolver;
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
index 57acb9d..0922d2f 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImpl.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -49,8 +50,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -60,7 +59,7 @@ import com.google.common.collect.Iterables;
 public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeFilter> implements AttributeFilter {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(AttributeFilterImpl.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeFilterImpl.class);
 
     /** Filter policies used by this engine. */
     private final List<AttributeFilterPolicy> filterPolicies;
@@ -87,7 +86,7 @@ public class AttributeFilterImpl extends AbstractServiceableComponent<AttributeF
         
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeFilterContext.
         profileContextStrategy =
-                Functions.compose(new ParentContextLookup<RelyingPartyContext, ProfileRequestContext>(),
+                new ParentContextLookup<RelyingPartyContext, ProfileRequestContext>().compose(
                         new ParentContextLookup<AttributeFilterContext, RelyingPartyContext>());
     }
 
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 617da5f..ece28d3 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
@@ -20,7 +20,9 @@ package net.shibboleth.idp.attribute.filter.matcher.impl;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -51,10 +53,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
 
 /**
  * A {@link net.shibboleth.idp.attribute.filter.Matcher} that delegates to a JSR-223 script for its actual processing.
@@ -86,9 +85,9 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
     public ScriptedMatcher() {
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeContext.
         prcLookupStrategy =
-                Functions.compose(new ParentContextLookup<RelyingPartyContext, ProfileRequestContext>(),
-                        new ParentContextLookup<AttributeFilterContext, RelyingPartyContext>());
-        scLookupStrategy = new ChildContextLookup<ProfileRequestContext, SubjectContext>(SubjectContext.class);
+                new ParentContextLookup<RelyingPartyContext,ProfileRequestContext>().compose(
+                        new ParentContextLookup<AttributeFilterContext,RelyingPartyContext>());
+        scLookupStrategy = new ChildContextLookup<>(SubjectContext.class);
     }
 
     /**
@@ -223,7 +222,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return Objects.hashCode(script, getId());
+        return Objects.hash(script, getId());
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcher.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcher.java
index 5b865a3..97984fe 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcher.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcher.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -45,8 +46,6 @@ import org.opensaml.saml.common.messaging.context.navigate.AttributeConsumerServ
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 
@@ -75,9 +74,8 @@ public class MappedAttributeInMetadataMatcher extends AbstractIdentifiableInitia
     
     /** Constructor. */
     public MappedAttributeInMetadataMatcher() {
-        objectStrategy = Functions.compose(new AttributeConsumerServiceLookupFunction(),
-                new ChildContextLookup<SAMLMetadataContext,AttributeConsumingServiceContext>(
-                        AttributeConsumingServiceContext.class));
+        objectStrategy = new AttributeConsumerServiceLookupFunction().compose(
+                new ChildContextLookup<>(AttributeConsumingServiceContext.class));
     }
 
     /**
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
index 1fb2cc7..ef23a49 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRule.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
@@ -32,10 +35,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-
 /**
  * Call out to an externally define predicate.
  */
@@ -53,7 +52,7 @@ public class PredicatePolicyRule extends AbstractPolicyRule {
     /** Constructor. */
     public PredicatePolicyRule() {
         profileContextStrategy =
-                Functions.compose(new ParentContextLookup<RelyingPartyContext,ProfileRequestContext>(),
+                new ParentContextLookup<RelyingPartyContext,ProfileRequestContext>().compose(
                         new ParentContextLookup<AttributeFilterContext,RelyingPartyContext>());
     }
 
@@ -112,17 +111,16 @@ public class PredicatePolicyRule extends AbstractPolicyRule {
      * {@inheritDoc}
      */
     @Override public Tristate matches(@Nonnull final AttributeFilterContext filterContext) {
-
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
+        
         final ProfileRequestContext pc = profileContextStrategy.apply(filterContext);
-
         if (null == pc) {
             log.warn("{} Could not locate profile context", getLogPrefix());
             return Tristate.FAIL;
         }
 
         try {
-            if (rulePredicate.apply(pc)) {
+            if (rulePredicate.test(pc)) {
                 log.trace("{} Predicate returned false", getLogPrefix());
                 return Tristate.TRUE;
             }
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 fc6d7c6..4d26222 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
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.attribute.filter.policyrule.impl;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,10 +46,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
 
 /**
  * A {@link net.shibboleth.idp.attribute.filter.PolicyRequirementRule} that delegates to a JSR-223 script for its actual
@@ -80,9 +79,9 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
     public ScriptedPolicyRule() {
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeContext.
         prcLookupStrategy =
-                Functions.compose(new ParentContextLookup<RelyingPartyContext, ProfileRequestContext>(),
-                        new ParentContextLookup<AttributeFilterContext, RelyingPartyContext>());
-        scLookupStrategy = new ChildContextLookup<ProfileRequestContext, SubjectContext>(SubjectContext.class);
+                new ParentContextLookup<RelyingPartyContext,ProfileRequestContext>().compose(
+                        new ParentContextLookup<AttributeFilterContext,RelyingPartyContext>());
+        scLookupStrategy = new ChildContextLookup<ProfileRequestContext,SubjectContext>(SubjectContext.class);
     }
 
     /**
@@ -215,7 +214,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return Objects.hashCode(script, getId());
+        return Objects.hash(script, getId());
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AttributeRequesterInEntityGroupPolicyRule.java b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AttributeRequesterInEntityGroupPolicyRule.java
index 5762db1..d366bab 100644
--- a/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AttributeRequesterInEntityGroupPolicyRule.java
+++ b/idp-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AttributeRequesterInEntityGroupPolicyRule.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
 import java.util.Collections;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,8 +35,6 @@ import org.opensaml.saml.saml2.metadata.EntityDescriptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 /**
  * A matcher that evaluates to true if attribute requester matches the provided entity group name,
  * or (as of 3.4.0) a valid metadata-sourced affiliation of entities.
@@ -125,7 +124,7 @@ public class AttributeRequesterInEntityGroupPolicyRule extends AbstractPolicyRul
                         checkAffiliations ? input.getMetadataResolver() : null);
         
         final EntityDescriptor entity = getEntityMetadata(input);
-        return predicate.apply(entity) ? Tristate.TRUE : Tristate.FALSE;
+        return predicate.test(entity) ? Tristate.TRUE : Tristate.FALSE;
     }
 
 }
\ No newline at end of file
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
index b8d1dae..95aa364 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/BaseComplexAttributeFilterTestCase.java
@@ -17,11 +17,8 @@
 
 package net.shibboleth.idp.attribute.filter.complex.impl;
 
-import java.util.List;
 import java.util.Map;
 
-import javax.annotation.Nullable;
-
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.filter.AttributeFilter;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
@@ -29,12 +26,10 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.attribute.resolver.dc.impl.SAMLAttributeDataConnector;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
 import org.opensaml.core.xml.XMLObjectBaseTestCase;
 import org.opensaml.saml.ext.saml2mdattr.EntityAttributes;
-import org.opensaml.saml.saml2.core.Attribute;
-
-import com.google.common.base.Function;
 
 /**
  * Base class for testing complex attribute filter operations.
@@ -59,12 +54,7 @@ public class BaseComplexAttributeFilterTestCase extends XMLObjectBaseTestCase {
 
         SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
         connector.setId(xmlFileName);
-        connector.setAttributesStrategy(new Function<AttributeResolutionContext, List<Attribute>>() {
-            @Override
-            @Nullable public List<Attribute> apply(@Nullable AttributeResolutionContext input) {
-                return obj.getAttributes();
-            }
-        });
+        connector.setAttributesStrategy(FunctionSupport.constant(obj.getAttributes()));
 
         connector.initialize();
 
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/MockValuePredicateMatcher.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/MockValuePredicateMatcher.java
index a486b0f..a01a615 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/MockValuePredicateMatcher.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/MockValuePredicateMatcher.java
@@ -17,12 +17,12 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import java.util.function.Predicate;
+
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.matcher.impl.AbstractMatcher;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
-import com.google.common.base.Predicate;
-
 public class MockValuePredicateMatcher extends AbstractMatcher {
 
     Predicate valuePredicate;
@@ -42,7 +42,7 @@ public class MockValuePredicateMatcher extends AbstractMatcher {
     /** {@inheritDoc} */
     protected boolean compareAttributeValue(IdPAttributeValue value) {
         
-        return valuePredicate.apply(value);
+        return valuePredicate.test(value);
     }
 
 }
\ No newline at end of file
diff --git a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
index ec97a4e..3deeed1 100644
--- a/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
+++ b/idp-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/PredicatePolicyRuleTest.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.filtercontext.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
@@ -28,9 +31,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * test for {@link PredicatePolicyRule}.
  */
@@ -83,7 +83,7 @@ public class PredicatePolicyRuleTest {
         }
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable ProfileRequestContext input) {
+        public boolean test(@Nullable ProfileRequestContext input) {
 
             return what;
         }
@@ -92,7 +92,7 @@ public class PredicatePolicyRuleTest {
     static class ThrowPred implements Predicate<ProfileRequestContext> {
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable ProfileRequestContext input) {
+        public boolean test(@Nullable ProfileRequestContext input) {
             throw new RuntimeException();
         }
     }
diff --git a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
index 8ffc4e0..a8fc753 100644
--- a/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
+++ b/idp-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/impl/AttributeFilterServiceStrategy.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.filter.spring.impl;
 
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -33,8 +34,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
 
-import com.google.common.base.Function;
-
 /**
  * Strategy for summoning up an {@link AttributeFilterImpl} from a populated {@link ApplicationContext}. We do this by
  * finding all the configured {@link AttributeFilterPolicy} beans and bunging them into the Attribute Filter which we
@@ -47,8 +46,7 @@ public class AttributeFilterServiceStrategy extends AbstractIdentifiableInitiali
     private final Logger log = LoggerFactory.getLogger(AttributeFilterServiceStrategy.class);
 
     /** {@inheritDoc} */
-    @Override @Nullable public ServiceableComponent<AttributeFilter>
-            apply(@Nullable final ApplicationContext appContext) {
+    @Nullable public ServiceableComponent<AttributeFilter> apply(@Nullable final ApplicationContext appContext) {
 
         final Collection<AttributeFilterPolicy> afps = appContext.getBeansOfType(AttributeFilterPolicy.class).values();
         log.debug("Creating Attribute Filter {} with  {} Policies", getId(), afps.size());
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 f8fbe89..a9c669d 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
@@ -18,11 +18,8 @@
 package net.shibboleth.idp.attribute.filter.spring;
 
 import java.util.Collection;
-import java.util.List;
 import java.util.Map;
 
-import javax.annotation.Nullable;
-
 import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
 import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
 import net.shibboleth.idp.attribute.IdPAttribute;
@@ -35,16 +32,14 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.attribute.resolver.dc.impl.SAMLAttributeDataConnector;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
 import org.opensaml.core.xml.XMLObjectBaseTestCase;
 import org.opensaml.saml.ext.saml2mdattr.EntityAttributes;
-import org.opensaml.saml.saml2.core.Attribute;
 import org.springframework.context.support.GenericApplicationContext;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 
-import com.google.common.base.Function;
-
 /**
  * Basis of all the matcher and rule parser tests.
  */
@@ -87,12 +82,7 @@ public class BaseAttributeFilterParserTest extends XMLObjectBaseTestCase {
 
         SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
         connector.setId(xmlFileName);
-        connector.setAttributesStrategy(new Function<AttributeResolutionContext, List<Attribute>>() {
-            @Override @Nullable public List<Attribute> apply(@Nullable AttributeResolutionContext input) {
-                return obj.getAttributes();
-            }
-        });
-
+        connector.setAttributesStrategy(FunctionSupport.constant(obj.getAttributes()));
         connector.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
diff --git a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/policy/PredicateRuleParserTest.java b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/policy/PredicateRuleParserTest.java
index 3bd5f8e..71513e6 100644
--- a/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/policy/PredicateRuleParserTest.java
+++ b/idp-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/policy/PredicateRuleParserTest.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.attribute.filter.spring.policy;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nullable;
 
 import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
@@ -33,9 +36,6 @@ import org.springframework.core.io.ClassPathResource;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 public class PredicateRuleParserTest extends BaseAttributeFilterParserTest {
 
     @Test public void policy() throws ComponentInitializationException {
@@ -122,7 +122,7 @@ public class PredicateRuleParserTest extends BaseAttributeFilterParserTest {
     static class Foo implements Predicate<AttributeFilterContext> {
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable AttributeFilterContext input) {
+        public boolean test(@Nullable AttributeFilterContext input) {
             return false;
         }
 
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
index df1eb8e..7c476c9 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
@@ -47,7 +47,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.PatternMatchUtils;
 
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
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 3cf7f8c..c676de2 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
@@ -19,7 +19,10 @@ package net.shibboleth.idp.attribute.resolver;
 
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -43,9 +46,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.DisposableBean;
 
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
 
@@ -179,7 +179,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
         try {
             if (null != activationCondition) {
                 final ProfileRequestContext profileRequestContext = profileContextStrategy.apply(resolutionContext);
-                if (!activationCondition.apply(profileRequestContext)) {
+                if (!activationCondition.test(profileRequestContext)) {
                     log.debug("Resolver plugin '{}': activation criteria not met, nothing to do", getId());
                     return null;
                 }
@@ -243,7 +243,7 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return Objects.hashCode(getId());
+        return Objects.hash(getId());
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
index 4234b88..7650f9c 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,8 +35,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * A proxy which wraps a resolved attribute definition and always returns the same attribute. The goal being that once
  * an attribute definition is resolved once this can be used in its place and calls to
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
index 5e8ebcd..c92f685 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.attribute.resolver;
 
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -32,8 +33,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * A proxy which wraps a resolved data connector and always returns the same attributes. The goal being that once a data
  * connector is resolved this can be used in its place and calls to
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
index 1ddf6c9..f01c1e4 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,8 +35,6 @@ import net.shibboleth.utilities.java.support.component.UnmodifiableComponent;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Interface defining the base work done by all plugins used within attribute resolution.
  * 
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/AbstractAttributeResolutionLookupFunction.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/AbstractAttributeResolutionLookupFunction.java
index 71baa7a..73755ec 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/AbstractAttributeResolutionLookupFunction.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/navigate/AbstractAttributeResolutionLookupFunction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.attribute.resolver.context.navigate;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -27,8 +29,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for a function that takes a {@link ProfileRequestContext} and requires access to an
  * {@link AttributeResolutionContext}.
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
index 660eca9..8cad2ac 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeIssuerIdPredicate.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.logic;
 
 import java.util.Collection;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -28,8 +29,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate that evaluates a {@link ProfileRequestContext} by looking for an attribute issuer
  * that matches one of a designated set or a generic predicate. The ID is obtained from a lookup
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
index a6b3619..ababe27 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributePrincipalPredicate.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.logic;
 
 import java.util.Collection;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -28,8 +29,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate that evaluates a {@link ProfileRequestContext} by looking for an attribute subject
  * that matches one of a designated set or a generic predicate. The ID is obtained from a lookup
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
index d25ee0b..820c3c3 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/logic/AttributeRecipientIdPredicate.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.logic;
 
 import java.util.Collection;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -28,8 +29,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate that evaluates a {@link ProfileRequestContext} by looking for an attribute recipient
  * that matches one of a designated set. The ID is obtained from a lookup function, by default from
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
index e9c901d..d175ab0 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver;
 
 import java.util.HashSet;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -31,7 +32,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /** Unit test for {@link ResolverPlugin}. */
@@ -170,7 +170,7 @@ public class AbstractResolverPluginTest {
     static class TestFunc implements Function<AttributeResolutionContext, ProfileRequestContext> {
 
         /** {@inheritDoc} */
-        @Override @Nullable public ProfileRequestContext apply(@Nullable AttributeResolutionContext input) {
+        @Nullable public ProfileRequestContext apply(@Nullable AttributeResolutionContext input) {
             return null;
         }
 
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockAttributeEncoder.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockAttributeEncoder.java
index a8545d8..8eb77b2 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockAttributeEncoder.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockAttributeEncoder.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.attribute.resolver;
 
+import java.util.function.Predicate;
+
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 import net.shibboleth.idp.attribute.AttributeEncoder;
@@ -48,19 +49,16 @@ public class MockAttributeEncoder extends AbstractInitializableComponent impleme
     }
 
     /** {@inheritDoc} */
-    @Override
     public String getProtocol() {
         return staticProtocol;
     }
 
     /** {@inheritDoc} */
-    @Override
     public String encode(IdPAttribute attribute) throws AttributeEncodingException {
         return staticValue;
     }
 
     /** {@inheritDoc} */
-    @Override
     public Predicate<ProfileRequestContext> getActivationCondition() {
         return Predicates.alwaysTrue();
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ContextDerivedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ContextDerivedAttributeDefinition.java
index e4a2f04..eda8ea1 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ContextDerivedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ContextDerivedAttributeDefinition.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.ad.impl;
 
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,8 +38,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An attribute definition which returns an attribute attributes derived from the {@link ProfileRequestContext}
  * associated with the request via a plugged in {@link Function}.
@@ -46,17 +45,17 @@ import com.google.common.base.Function;
 public class ContextDerivedAttributeDefinition extends AbstractAttributeDefinition {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(ContextDerivedAttributeDefinition.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ContextDerivedAttributeDefinition.class);
 
     /** Strategy used to locate the {@link ProfileRequestContext} to use. */
-    @Nonnull private Function<AttributeResolutionContext, ProfileRequestContext> prcLookupStrategy;
+    @Nonnull private Function<AttributeResolutionContext,ProfileRequestContext> prcLookupStrategy;
 
     /**
      * Function used to generate the values associated with the {@link ProfileRequestContext}
      * 
      * The function returns null or an empty list if the context isn't relevant.
      */
-    @Nonnull private Function<ProfileRequestContext, List<IdPAttributeValue<?>>> attributeValuesFunction;
+    @Nonnull private Function<ProfileRequestContext,List<IdPAttributeValue<?>>> attributeValuesFunction;
 
     /** Constructor. */
     public ContextDerivedAttributeDefinition() {
@@ -71,7 +70,7 @@ public class ContextDerivedAttributeDefinition extends AbstractAttributeDefiniti
      *            {@link AttributeResolutionContext}
      */
     public void setProfileRequestContextLookupStrategy(
-            @Nonnull final Function<AttributeResolutionContext, ProfileRequestContext> strategy) {
+            @Nonnull final Function<AttributeResolutionContext,ProfileRequestContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         prcLookupStrategy = Constraint.isNotNull(strategy, "ProfileRequestContext lookup strategy cannot be null");
@@ -83,7 +82,7 @@ public class ContextDerivedAttributeDefinition extends AbstractAttributeDefiniti
      * @param function what to set.
      */
     public void setAttributeValuesFunction(
-            @Nonnull final Function<ProfileRequestContext, List<IdPAttributeValue<?>>> function) {
+            @Nonnull final Function<ProfileRequestContext,List<IdPAttributeValue<?>>> function) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         attributeValuesFunction = Constraint.isNotNull(function, "Attribute Function cannot be null");
     }
@@ -93,7 +92,7 @@ public class ContextDerivedAttributeDefinition extends AbstractAttributeDefiniti
             @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
 
         final ProfileRequestContext prc = prcLookupStrategy.apply(resolutionContext);
-        @Nullable final List<IdPAttributeValue<?>> results = attributeValuesFunction.apply(prc);
+        final List<IdPAttributeValue<?>> results = attributeValuesFunction.apply(prc);
 
         if (null == results) {
             log.debug("{} Generated no values.", getLogPrefix());
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/IdPAttributePrincipalValuesFunction.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/IdPAttributePrincipalValuesFunction.java
index 20cbecd..1e4abf8 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/IdPAttributePrincipalValuesFunction.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/IdPAttributePrincipalValuesFunction.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.attribute.resolver.ad.impl;
 
 import java.security.Principal;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -32,8 +33,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
 import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
 
-import com.google.common.base.Function;
-
 /** Engine to mine values from {@link IdPAttributePrincipal}s. */
 public class IdPAttributePrincipalValuesFunction extends AbstractInitializableComponent implements
         Function<Principal, List<IdPAttributeValue<?>>> {
@@ -73,7 +72,7 @@ public class IdPAttributePrincipalValuesFunction extends AbstractInitializableCo
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public List<IdPAttributeValue<?>> apply(@Nullable final Principal principal) {
+    @Nullable public List<IdPAttributeValue<?>> apply(@Nullable final Principal principal) {
 
         if (null != principal && principal instanceof IdPAttributePrincipal) {
             final IdPAttributePrincipal attributePrincipal = (IdPAttributePrincipal) principal;
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 1ec0749..24fed88 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.ad.impl;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -49,8 +50,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import edu.internet2.middleware.shibboleth.common.attribute.provider.V2SAMLProfileRequestContext;
 
 /**
@@ -87,10 +86,10 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
     @NonnullAfterInit private AttributeDefinitionScriptEvaluator scriptEvaluator;
 
     /** Strategy used to locate the {@link ProfileRequestContext} to use. */
-    @Nonnull private Function<AttributeResolutionContext, ProfileRequestContext> prcLookupStrategy;
+    @Nonnull private Function<AttributeResolutionContext,ProfileRequestContext> prcLookupStrategy;
 
     /** Strategy used to locate the {@link SubjectContext} to use. */
-    @Nonnull private Function<ProfileRequestContext, SubjectContext> scLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,SubjectContext> scLookupStrategy;
 
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
@@ -152,7 +151,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
      *            {@link AttributeResolutionContext}
      */
     public void setProfileRequestContextLookupStrategy(
-            @Nonnull final Function<AttributeResolutionContext, ProfileRequestContext> strategy) {
+            @Nonnull final Function<AttributeResolutionContext,ProfileRequestContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
@@ -167,7 +166,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
      *            {@link AttributeResolutionContext}
      */
     public void
-            setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext, SubjectContext> strategy) {
+            setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext,SubjectContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SubjectDerivedAttributeValuesFunction.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SubjectDerivedAttributeValuesFunction.java
index af71ddf..22d84e0 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SubjectDerivedAttributeValuesFunction.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SubjectDerivedAttributeValuesFunction.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.ad.impl;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,31 +38,29 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A Function which returns {@link IdPAttributeValue}s derived from the {@link java.security.Principal}s
  * associated with the request.  The precise values are determined by an injected {@link Function}.
  */
 public class SubjectDerivedAttributeValuesFunction extends AbstractIdentifiableInitializableComponent implements
-        Function<ProfileRequestContext, List<IdPAttributeValue<?>>> {
+        Function<ProfileRequestContext,List<IdPAttributeValue<?>>> {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(ContextDerivedAttributeDefinition.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ContextDerivedAttributeDefinition.class);
 
     /** Strategy used to locate the {@link SubjectContext} to use. */
-    @Nonnull private Function<ProfileRequestContext, SubjectContext> scLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,SubjectContext> scLookupStrategy;
 
     /**
      * {@link Function} used to generate the values associated with a {@link Principal}
      * 
      * The {@link Function} returns null or an empty list if the {@link Principal} isn't relevant.
      */
-    @Nonnull private Function<Principal, List<IdPAttributeValue<?>>> attributesValueFunction;
+    @Nonnull private Function<Principal,List<IdPAttributeValue<?>>> attributesValueFunction;
 
     /** Constructor. */
     public SubjectDerivedAttributeValuesFunction() {
-        scLookupStrategy = new ChildContextLookup<ProfileRequestContext, SubjectContext>(SubjectContext.class);
+        scLookupStrategy = new ChildContextLookup<ProfileRequestContext,SubjectContext>(SubjectContext.class);
     }
 
     /**
@@ -72,7 +71,7 @@ public class SubjectDerivedAttributeValuesFunction extends AbstractIdentifiableI
      *            {@link net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext}
      */
     public void
-            setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext, SubjectContext> strategy) {
+            setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext,SubjectContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         scLookupStrategy = Constraint.isNotNull(strategy, "SubjectContext lookup strategy cannot be null");
@@ -83,15 +82,13 @@ public class SubjectDerivedAttributeValuesFunction extends AbstractIdentifiableI
      * 
      * @param engine what to set.
      */
-    public void setAttributeValuesFunction(@Nonnull final Function<Principal, List<IdPAttributeValue<?>>> engine) {
+    public void setAttributeValuesFunction(@Nonnull final Function<Principal,List<IdPAttributeValue<?>>> engine) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         attributesValueFunction = Constraint.isNotNull(engine, "Attribute Engine cannot be null");
     }
 
     /** {@inheritDoc} */
-    @Override
-    @Nullable
-    public List<IdPAttributeValue<?>> apply(@Nullable final ProfileRequestContext prc) {
+    @Nullable public List<IdPAttributeValue<?>> apply(@Nullable final ProfileRequestContext prc) {
         final SubjectContext cs = scLookupStrategy.apply(prc);
         final List<IdPAttributeValue<?>> results = new ArrayList<>(1);
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
index a53cbe7..4932212 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.PatternSyntaxException;
 
@@ -30,7 +31,6 @@ import javax.annotation.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -50,7 +50,7 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 public class ValueMap implements Function<String, Set<StringAttributeValue>> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(ValueMap.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ValueMap.class);
 
     /** Return value. */
     private String returnValue;
@@ -109,7 +109,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
      */
     /** {@inheritDoc} */
     // CheckStyle: CyclomaticComplexity OFF
-    @Override @Nullable public Set<StringAttributeValue> apply(@Nullable final String attributeValue) {
+    @Nullable public Set<StringAttributeValue> apply(@Nullable final String attributeValue) {
         
         if (attributeValue == null) {
             log.debug("Input value was null, returning empty set");
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 8a20a44..68baf0f 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
@@ -25,6 +25,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -55,8 +56,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A Data Connector which populates a series of attributes from a provided {@link ProfileRequestContext}.
  */
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 c8a9731..fad4cea 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
@@ -24,6 +24,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -36,7 +37,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 
 import net.shibboleth.ext.spring.service.AbstractServiceableComponent;
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
index 410c3cb..4143657 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
@@ -25,6 +25,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 import javax.script.ScriptException;
@@ -64,8 +65,6 @@ import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** test for {@link net.shibboleth.idp.attribute.resolver.ad.impl.ScriptedIdPAttributeImpl}. */
 public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
@@ -670,7 +669,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         }
 
         /** {@inheritDoc} */
-        @Override @Nullable public List<Attribute> apply(@Nullable final AttributeResolutionContext input) {
+        @Nullable public List<Attribute> apply(@Nullable final AttributeResolutionContext input) {
             return obj.getAttributes();
         }
 
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 303b593..fe9b7ef 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,8 +45,6 @@ import org.opensaml.saml.saml2.core.Attribute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Data Connector to extra attributes from a saml2 {@link Assertion}. It is hoped that this connector will eventually
  * end up being used in mainline operation, which is why the code looks more suitable for being plugged into a webflow
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnectorTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnectorTest.java
index b1af3f8..d977eb7 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnectorTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/SAMLAttributeDataConnectorTest.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.attribute.resolver.dc.impl;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -37,8 +38,6 @@ import org.opensaml.saml.saml2.core.Attribute;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /**
  * test for the {@link SAMLAttributeDataConnector}
  */
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolutionContextTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolutionContextTest.java
index 60fc34a..165f5cf 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolutionContextTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolutionContextTest.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.impl;
 
 import java.util.HashSet;
+import java.util.function.Function;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -30,8 +31,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** Unit test for {@link AttributeResolutionContext}. */
 public class AttributeResolutionContextTest {
     
@@ -121,9 +120,9 @@ public class AttributeResolutionContextTest {
         Assert.assertSame(context.getAttributeIssuerID(), THE_ISSUER);
         Assert.assertSame(context.getAttributeRecipientID(), THE_RECIPIENT);
         
-        final Function<ProfileRequestContext, String> principalFn = new AttributePrincipalLookupFunction();
-        final Function<ProfileRequestContext, String> recipientFn = new AttributeRecipientIdLookupFunction();
-        final Function<ProfileRequestContext, String> issuerFn = new AttributeIssuerIdLookupFunction();
+        final Function<ProfileRequestContext,String> principalFn = new AttributePrincipalLookupFunction();
+        final Function<ProfileRequestContext,String> recipientFn = new AttributeRecipientIdLookupFunction();
+        final Function<ProfileRequestContext,String> issuerFn = new AttributeIssuerIdLookupFunction();
         
         Assert.assertSame(principalFn.apply(profileCtx), THE_PRINCIPAL);
         Assert.assertSame(issuerFn.apply(profileCtx), THE_ISSUER);
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 b6c71a0..39265dc 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
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.attribute.resolver.spring.impl;
 
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,9 +31,6 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * A factory bean to collect the parameterization that goes onto a {@link AbstractResolverPlugin}.
  * 
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
index 9ea9af3..534c262 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverServiceStrategy.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.attribute.resolver.spring.impl;
 
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -26,8 +27,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
@@ -69,8 +68,7 @@ public class AttributeResolverServiceStrategy extends AbstractIdentifiableInitia
    }
 
     /** {@inheritDoc} */
-    @Override @Nullable public ServiceableComponent<AttributeResolver> apply(
-            @Nullable final ApplicationContext appContext) {
+    @Nullable public ServiceableComponent<AttributeResolver> apply(@Nullable final ApplicationContext appContext) {
 
         final Collection<PrincipalConnector> pcs = appContext.getBeansOfType(PrincipalConnector.class).values();
         final PrinicpalConnectorCanonicalizer pcc = new PrinicpalConnectorCanonicalizer();
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
index 0d99c73..6bd5dbc 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeResolverTest.java
@@ -19,6 +19,8 @@ package net.shibboleth.idp.attribute.resolver.spring;
 
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nullable;
 import javax.security.auth.Subject;
@@ -38,8 +40,6 @@ import org.testng.annotations.AfterTest;
 import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.unboundid.ldap.listener.InMemoryDirectoryServer;
 import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
 import com.unboundid.ldap.listener.InMemoryListenerConfig;
@@ -460,7 +460,7 @@ public class AttributeResolverTest extends OpenSAMLInitBaseTestCase {
         }
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
             return value.equals(navigate.apply(input));
         }
     }
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringNameIdentifierEncoderParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringNameIdentifierEncoderParserTest.java
index 979831f..db090e6 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringNameIdentifierEncoderParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/enc/SAML1StringNameIdentifierEncoderParserTest.java
@@ -68,6 +68,6 @@ public class SAML1StringNameIdentifierEncoderParserTest extends BaseAttributeDef
                 getAttributeEncoder("resolver/saml1StringNameIdentifierConditional.xml", SAML1StringNameIdentifierEncoder.class, context);
 
         Assert.assertSame(encoder.getActivationCondition(), Predicates.alwaysFalse());
-        Assert.assertFalse(encoder.getActivationCondition().apply(null));
+        Assert.assertFalse(encoder.getActivationCondition().test(null));
     }
 }
\ No newline at end of file
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 dcdd2c5..1660762 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
@@ -58,7 +58,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseAttributeDefiniti
                 getAttributeEncoder("resolver/saml2StringDefault.xml", SAML2StringAttributeEncoder.class);
 
         Assert.assertSame(encoder.getActivationCondition(), Predicates.alwaysTrue());
-        Assert.assertTrue(encoder.getActivationCondition().apply(null));
+        Assert.assertTrue(encoder.getActivationCondition().test(null));
         Assert.assertEquals(encoder.getName(), "Saml2StringName");
         Assert.assertNull(encoder.getFriendlyName()); 
         Assert.assertEquals(encoder.getNameFormat(), Attribute.URI_REFERENCE);
@@ -78,7 +78,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseAttributeDefiniti
                 getAttributeEncoder("resolver/saml2StringConditional.xml", SAML2StringAttributeEncoder.class, context);
 
         Assert.assertSame(encoder.getActivationCondition(), Predicates.alwaysFalse());
-        Assert.assertFalse(encoder.getActivationCondition().apply(null));
+        Assert.assertFalse(encoder.getActivationCondition().test(null));
     }
 
     @Test public void conditionalScript() {
@@ -89,7 +89,7 @@ public class SAML2StringAttributeEncoderParserTest extends BaseAttributeDefiniti
                 getAttributeEncoder("resolver/saml2String.xml", SAML2StringAttributeEncoder.class, context);
 
         Assert.assertTrue(encoder.getActivationCondition() instanceof ScriptedPredicate);
-        Assert.assertFalse(encoder.getActivationCondition().apply(null));
+        Assert.assertFalse(encoder.getActivationCondition().test(null));
     }
 
 }
\ No newline at end of file
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 3e9f118..2780f5c 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.authn;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -29,8 +31,6 @@ import org.opensaml.profile.action.ActionSupport;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 
-import com.google.common.base.Function;
-
 /**
  * A base class for authentication related actions.
  * 
@@ -52,7 +52,7 @@ public abstract class AbstractAuthenticationAction<InboundMessageType, OutboundM
      * Strategy used to extract, and create if necessary, the {@link AuthenticationContext} from the
      * {@link ProfileRequestContext}.
      */
-    @Nonnull private Function<ProfileRequestContext, AuthenticationContext> authnCtxLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,AuthenticationContext> authnCtxLookupStrategy;
     
     /** AuthenticationContext to operate on. */
     @Nullable private AuthenticationContext authnContext;
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 5a0065c..9371fa7 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -42,8 +43,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A base class for subject canonicalization actions.
  * 
@@ -68,7 +67,7 @@ public abstract class AbstractSubjectCanonicalizationAction<InboundMessageType,
      * Strategy used to find the {@link SubjectCanonicalizationContext} from the
      * {@link ProfileRequestContext}.
      */
-    @Nonnull private Function<ProfileRequestContext, SubjectCanonicalizationContext> scCtxLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,SubjectCanonicalizationContext> scCtxLookupStrategy;
     
     /** {@link SubjectCanonicalizationContext} to operate on. */
     @Nullable private SubjectCanonicalizationContext scContext;
@@ -101,7 +100,7 @@ public abstract class AbstractSubjectCanonicalizationAction<InboundMessageType,
      * @param strategy  lookup strategy function for {@link SubjectCanonicalizationContext}.
      */
     public void setLookupStrategy(
-            @Nonnull final Function<ProfileRequestContext, SubjectCanonicalizationContext> strategy) {
+            @Nonnull final Function<ProfileRequestContext,SubjectCanonicalizationContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         scCtxLookupStrategy = Constraint.isNotNull(strategy, "Strategy 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 34e5d00..6d4fa90 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
@@ -23,6 +23,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -53,8 +55,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
@@ -305,7 +305,7 @@ public abstract class AbstractValidationAction<InboundMessageType, OutboundMessa
                         rpCtx.getPrincipalEvalPredicateFactoryRegistry().lookup(p.getClass(), rpCtx.getOperator());
                 if (factory != null) {
                     final PrincipalEvalPredicate predicate = factory.getPredicate(p);
-                    if (predicate.apply(this)) {
+                    if (predicate.test(this)) {
                         log.debug("{} Compatible with principal type '{}' and operator '{}'", getLogPrefix(),
                                 p.getClass(), rpCtx.getOperator());
                         rpCtx.setMatchingPrincipal(predicate.getMatchingPrincipal());
@@ -362,7 +362,7 @@ public abstract class AbstractValidationAction<InboundMessageType, OutboundMessa
         
         // Override cacheability if a predicate is installed.
         if (authenticationContext.isResultCacheable() && resultCachingPredicate != null) {
-            authenticationContext.setResultCacheable(resultCachingPredicate.apply(profileRequestContext));
+            authenticationContext.setResultCacheable(resultCachingPredicate.test(profileRequestContext));
             log.info("{} Predicate indicates authentication result {} be cacheable in a session", getLogPrefix(),
                     authenticationContext.isResultCacheable() ? "will" : "will not");
         }
@@ -461,7 +461,7 @@ public abstract class AbstractValidationAction<InboundMessageType, OutboundMessa
             final MessageChecker checker = new MessageChecker(message);
             
             for (final Map.Entry<String, Collection<String>> entry : classifiedMessages.entrySet()) {
-                if (Iterables.any(entry.getValue(), checker)) {
+                if (Iterables.any(entry.getValue(), checker::test)) {
                     authenticationContext.getSubcontext(AuthenticationErrorContext.class,
                             true).getClassifiedErrors().add(entry.getKey());
                     if (!eventSet) {
@@ -503,7 +503,7 @@ public abstract class AbstractValidationAction<InboundMessageType, OutboundMessa
             final MessageChecker checker = new MessageChecker(message);
             
             for (final Map.Entry<String, Collection<String>> entry : classifiedMessages.entrySet()) {
-                if (Iterables.any(entry.getValue(), checker)) {
+                if (Iterables.any(entry.getValue(), checker::test)) {
                     authenticationContext.getSubcontext(AuthenticationWarningContext.class,
                             true).getClassifiedWarnings().add(entry.getKey());
                     if (!eventSet) {
@@ -536,7 +536,7 @@ public abstract class AbstractValidationAction<InboundMessageType, OutboundMessa
         }
         
         /** {@inheritDoc} */
-        public boolean apply(final String input) {
+        public boolean test(final String input) {
             return s.contains(input);
         }
     }
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 4a40a6b..1680062 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
@@ -25,6 +25,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -47,7 +48,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.storage.StorageSerializer;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -311,8 +311,8 @@ public class AuthenticationFlowDescriptor extends AbstractIdentifiableInitializa
     }
 
     /** {@inheritDoc} */
-    @Override public boolean apply(@Nullable final ProfileRequestContext input) {
-        return activationCondition.apply(input);
+    public boolean test(@Nullable final ProfileRequestContext input) {
+        return activationCondition.test(input);
     }
     
     /**
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 fab9486..26a0abb 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.authn;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,8 +35,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A ruleset for managing the transition out of a step during the multi-factor authn flow.
  * 
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptor.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptor.java
index de0437f..6625aeb 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptor.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.authn;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.profile.FlowDescriptor;
@@ -27,7 +29,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.profile.context.ProfileRequestContext;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -64,10 +65,10 @@ public class SubjectCanonicalizationFlowDescriptor extends AbstractIdentifiableI
     }
 
     /** {@inheritDoc} */
-    @Override public boolean apply(final ProfileRequestContext input) {
-        return activationCondition.apply(input);
+    @Override public boolean test(final ProfileRequestContext input) {
+        return activationCondition.test(input);
     }
-
+    
     /** {@inheritDoc} */
     @Override public int hashCode() {
         return getId().hashCode();
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/AuthenticationContext.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/AuthenticationContext.java
index ccadb5d..e67ec58 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/AuthenticationContext.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/context/AuthenticationContext.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -47,7 +48,6 @@ import org.joda.time.DateTime;
 import org.opensaml.messaging.context.BaseContext;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
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 28dc9e4..e28a400 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
@@ -206,7 +206,7 @@ public class RequestedPrincipalContext extends BaseContext {
         for (final Principal requestedPrincipal : requestedPrincipals) {
             final PrincipalEvalPredicate predicate = getPredicate(requestedPrincipal);
             if (predicate != null) {
-                if (predicate.apply(component)) {
+                if (predicate.test(component)) {
                     return true;
                 }
             }
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 70bbb40..bd96926 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.authn.principal;
 
 import java.security.Principal;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -31,8 +32,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Function that returns the first custom {@link Principal} of a particular type found on the
  * {@link net.shibboleth.idp.authn.AuthenticationResult} returned by
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicate.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicate.java
index a37b1ca..b52e324 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicate.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicate.java
@@ -18,11 +18,10 @@
 package net.shibboleth.idp.authn.principal;
 
 import java.security.Principal;
+import java.util.function.Predicate;
 
 import javax.annotation.Nullable;
 
-import com.google.common.base.Predicate;
-
 /**
  * A {@link Predicate} to evaluate a {@link Principal} that represents a requested form of
  * authentication against a set of principals supported by a {@link PrincipalSupportingComponent}.
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactory.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactory.java
index 8a56246..64c7145 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactory.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/PrincipalEvalPredicateFactory.java
@@ -22,7 +22,7 @@ import java.security.Principal;
 import javax.annotation.Nonnull;
 
 /**
- * Generates a {@link com.google.common.base.Predicate} to evaluate a {@link PrincipalSupportingComponent}
+ * Generates a {@link java.util.function.Predicate} to evaluate a {@link PrincipalSupportingComponent}
  * against a requested form of authentication expressed in terms of a {@link Principal}.
  * 
  * <p>The predicate is constructed around a {@link Principal} to compare in an
@@ -39,7 +39,7 @@ public interface PrincipalEvalPredicateFactory {
      * 
      * @param candidate a {@link Principal} object to evaluate
      * 
-     * @return a {@link com.google.common.base.Predicate} implementing custom matching rules
+     * @return a {@link PrincipalEvalPredicate} implementing custom matching rules
      */
     @Nonnull PrincipalEvalPredicate getPredicate(@Nonnull final Principal candidate);
 }
\ No newline at end of file
diff --git a/idp-authn-api/src/test/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptorTest.java b/idp-authn-api/src/test/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptorTest.java
index 0f934fb..9df8475 100644
--- a/idp-authn-api/src/test/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptorTest.java
+++ b/idp-authn-api/src/test/java/net/shibboleth/idp/authn/SubjectCanonicalizationFlowDescriptorTest.java
@@ -50,7 +50,7 @@ public class SubjectCanonicalizationFlowDescriptorTest {
 
     @Test public void testInstantation() throws ComponentInitializationException {
         Assert.assertEquals(descriptor.getId(), "test");
-        Assert.assertTrue(descriptor.apply(prc));
+        Assert.assertTrue(descriptor.test(prc));
     }
 
     @Test public void testSetters() {
@@ -78,7 +78,7 @@ public class SubjectCanonicalizationFlowDescriptorTest {
         descriptor.setActivationCondition(Predicates.<ProfileRequestContext> alwaysFalse());
         descriptor.initialize();
 
-        Assert.assertFalse(descriptor.apply(prc));
+        Assert.assertFalse(descriptor.test(prc));
     }
 
 }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/audit/impl/AuthenticationFlowAuditExtractor.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/audit/impl/AuthenticationFlowAuditExtractor.java
index 0a5fea5..c01fb27 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/audit/impl/AuthenticationFlowAuditExtractor.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/audit/impl/AuthenticationFlowAuditExtractor.java
@@ -17,19 +17,18 @@
 
 package net.shibboleth.idp.authn.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 
 /** {@link Function} that returns the authentication flow ID used to satisfy a request. */
 public class AuthenticationFlowAuditExtractor implements Function<ProfileRequestContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
 
         final AuthenticationContext authnCtx = input.getSubcontext(AuthenticationContext.class);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ExtractDuoAuthenticationFromHeaders.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ExtractDuoAuthenticationFromHeaders.java
index 1e69daf..ba43d7c 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ExtractDuoAuthenticationFromHeaders.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ExtractDuoAuthenticationFromHeaders.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.authn.duo.impl;
 
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -28,8 +29,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.AbstractAuthenticationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
index 81ec98d..95ee8ac 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.authn.duo.impl;
 
 import java.security.Principal;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,8 +30,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.AbstractValidationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
index b680545..f340e11 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
@@ -26,6 +26,7 @@ import java.io.IOException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.Principal;
+import java.util.function.Function;
 
 import net.shibboleth.idp.authn.AbstractValidationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -46,7 +47,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.duosecurity.duoweb.DuoWebException;
-import com.google.common.base.Function;
 
 /**
  * An action that validates a DuoWeb response message and produces an
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalization.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalization.java
index 92a6e9f..c923e2b 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalization.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalization.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.authn.impl;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -45,9 +46,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * An action that extracts a resolved {@link IdPAttribute} value from an {@link AttributeContext} child obtained via
  * lookup function (by default a child of the {@link SubjectCanonicalizationContext}), and uses it as the result
@@ -86,9 +84,9 @@ public class AttributeSourcedSubjectCanonicalization extends AbstractSubjectCano
         delimiter = '@';
         attributeSourceIds = Collections.emptyList();
         
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,SubjectCanonicalizationContext>(
-                        SubjectCanonicalizationContext.class));
+        attributeContextLookupStrategy =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(SubjectCanonicalizationContext.class));
     }
     
     /**
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
index d942a58..b8cdbf3 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.authn.impl;
 import java.io.IOException;
 import java.security.Principal;
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.security.auth.Subject;
@@ -32,8 +33,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.ExternalAuthentication;
 import net.shibboleth.idp.authn.ExternalAuthenticationException;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FilterFlowsByAttribute.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FilterFlowsByAttribute.java
index f916f0d..0d54a4e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FilterFlowsByAttribute.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FilterFlowsByAttribute.java
@@ -22,6 +22,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -45,9 +46,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * An authentication action that filters out potential authentication flows by comparing an {@link IdPAttribute}'s
  * values to the custom principals supported by each flow.
@@ -81,9 +79,8 @@ public class FilterFlowsByAttribute extends AbstractAuthenticationAction {
     /** Constructor. */
     public FilterFlowsByAttribute() {
         attributeContextLookupStrategy =
-                Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                        new ChildContextLookup<ProfileRequestContext, AuthenticationContext>(
-                                AuthenticationContext.class));
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(AuthenticationContext.class));
         filterActiveResults = true;
     }
 
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 30c5f8b..7abf48c 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
@@ -45,7 +45,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 /**
  * An authentication action that runs after a completed authentication flow (or the reuse
  * of an active result) and transfers information from other contexts into a {@link SubjectContext}
@@ -230,7 +229,7 @@ public class FinalizeAuthentication extends AbstractAuthenticationAction {
                 matches.clear();
                 for (final Principal candidate
                         : authenticationContext.getAuthenticationResult().getSupportedPrincipals(p.getClass())) {
-                    if (predicate.apply(new PrincipalSupportingComponent() {
+                    if (predicate.test(new PrincipalSupportingComponent() {
                         public <T extends Principal> Set<T> getSupportedPrincipals(final Class<T> c) {
                             return Collections.<T>singleton((T) candidate);
                         }
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 95cca1a..c955a45 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
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.util.Collection;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,10 +46,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-
 /**
  * An authentication action that completes MFA by producing a final {@link AuthenticationResult}
  * out of whatever constituent parts and pieces exist, by means of an overridable function,
@@ -88,9 +86,9 @@ public class FinalizeMultiFactorAuthentication extends AbstractAuthenticationAct
 
     /** Constructor. */
     public FinalizeMultiFactorAuthentication() {
-        multiFactorContextLookupStrategy = Functions.compose(
-                new ChildContextLookup(MultiFactorAuthenticationContext.class),
-                new ChildContextLookup(AuthenticationContext.class));
+        multiFactorContextLookupStrategy =
+                new ChildContextLookup(MultiFactorAuthenticationContext.class).compose(
+                        new ChildContextLookup(AuthenticationContext.class));
                 
         requesterLookupStrategy = new RelyingPartyIdLookupFunction();
         responderLookupStrategy = new ResponderIdLookupFunction();
@@ -202,7 +200,7 @@ public class FinalizeMultiFactorAuthentication extends AbstractAuthenticationAct
         
         // Override cacheability if a predicate is installed.
         if (authenticationContext.isResultCacheable() && resultCachingPredicate != null) {
-            authenticationContext.setResultCacheable(resultCachingPredicate.apply(profileRequestContext));
+            authenticationContext.setResultCacheable(resultCachingPredicate.test(profileRequestContext));
             log.info("{} Predicate indicates authentication result {} be cacheable in a session", getLogPrefix(),
                     authenticationContext.isResultCacheable() ? "will" : "will not");
         }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
index 91d21d7..bd14e72 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContext.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.authn.impl;
 
 import java.security.Principal;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -39,8 +40,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An action that creates an {@link RequestedPrincipalContext} and attaches it to the current
  * {@link AuthenticationContext}, if the profile request context contains a {@link RelyingPartyContext}
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContext.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContext.java
index ecd9689..a93c15e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContext.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContext.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.authn.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -38,7 +39,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -194,7 +194,7 @@ public class PopulateAuthenticationContext extends AbstractAuthenticationAction
                 final String flowId = desc.getId().substring(desc.getId().indexOf('/') + 1);
                 if (activeFlows.contains(flowId)) {
                     if (authenticationContext.getAvailableFlows().containsKey(desc.getId())
-                            && desc.apply(profileRequestContext)) {
+                            && desc.test(profileRequestContext)) {
                         authenticationContext.getPotentialFlows().put(desc.getId(), desc);
                     } else {
                         log.debug("{} Filtered out authentication flow {}", getLogPrefix(), desc.getId());
@@ -207,7 +207,7 @@ public class PopulateAuthenticationContext extends AbstractAuthenticationAction
         } else {
             for (final AuthenticationFlowDescriptor desc : potentialFlows) {
                 if (authenticationContext.getAvailableFlows().containsKey(desc.getId())
-                        && desc.apply(profileRequestContext)) {
+                        && desc.test(profileRequestContext)) {
                     authenticationContext.getPotentialFlows().put(desc.getId(), desc);
                 } else {
                     log.debug("{} Filtered out authentication flow {}", getLogPrefix(), desc.getId());
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 26aed1f..97271fe 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,9 +45,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * An action that creates and populates a {@link MultiFactorAuthenticationContext} with the set of
  * transition rules to use for coordinating activity, the executing {@link AuthenticationFlowDescriptor}
@@ -82,9 +80,9 @@ public class PopulateMultiFactorAuthenticationContext extends AbstractAuthentica
     /** Constructor. */
     PopulateMultiFactorAuthenticationContext() {
         transitionMapLookupStrategy = FunctionSupport.constant(null);
-        multiFactorContextCreationStrategy = Functions.compose(
-                new ChildContextLookup(MultiFactorAuthenticationContext.class, true),
-                new ChildContextLookup(AuthenticationContext.class));
+        multiFactorContextCreationStrategy =
+                new ChildContextLookup(MultiFactorAuthenticationContext.class, true).compose(
+                        new ChildContextLookup(AuthenticationContext.class));
         activeResultLookupStrategy = new DefaultResultLookupStrategy();
     }
     
@@ -230,7 +228,7 @@ public class PopulateMultiFactorAuthenticationContext extends AbstractAuthentica
             final AuthenticationFlowDescriptor descriptor = authenticationContext.getAvailableFlows().get(
                     candidate.getAuthenticationFlowId());
             if (descriptor != null) {
-                if (descriptor.apply(profileRequestContext)) {
+                if (descriptor.test(profileRequestContext)) {
                     if (descriptor.isResultActive(candidate)) {
                         if (authenticationContext.getMaxAge() > 0
                                 && candidate.getAuthenticationInstant() + authenticationContext.getMaxAge()
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 e96ae69..652d76d 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
@@ -187,7 +187,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
         // If not forced, or we just did it, check for an active result for that flow.
 
         final AuthenticationResult activeResult;
-        if (!authenticationContext.isForceAuthn() && flow.getReuseCondition().apply(profileRequestContext)) {
+        if (!authenticationContext.isForceAuthn() && flow.getReuseCondition().test(profileRequestContext)) {
             activeResult = authenticationContext.getActiveResults().get(flow.getId());
         } else {
             activeResult = null;
@@ -198,7 +198,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
                 for (final Principal p : requestedPrincipalCtx.getRequestedPrincipals()) {
                     final PrincipalEvalPredicate predicate = requestedPrincipalCtx.getPredicate(p);
                     if (predicate != null) {
-                        if (predicate.apply(activeResult)) {
+                        if (predicate.test(activeResult)) {
                             selectActiveResult(profileRequestContext, authenticationContext, activeResult);
                             return;
                         }
@@ -225,7 +225,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
             for (final Principal p : requestedPrincipalCtx.getRequestedPrincipals()) {
                 final PrincipalEvalPredicate predicate = requestedPrincipalCtx.getPredicate(p);
                 if (predicate != null) {
-                    if (predicate.apply(flow) && flow.apply(profileRequestContext)) {
+                    if (predicate.test(flow) && flow.test(profileRequestContext)) {
                         selectInactiveFlow(profileRequestContext, authenticationContext, flow);
                         return;
                     }
@@ -235,7 +235,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
                             p.getClass());
                 }
             }
-        } else if (flow.apply(profileRequestContext)) {
+        } else if (flow.test(profileRequestContext)) {
             selectInactiveFlow(profileRequestContext, authenticationContext, flow);
             return;
         }
@@ -279,7 +279,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
         for (final AuthenticationResult activeResult : authenticationContext.getActiveResults().values()) {
             final AuthenticationFlowDescriptor flow = authenticationContext.getPotentialFlows().get(
                     activeResult.getAuthenticationFlowId());
-            if (flow != null && flow.getReuseCondition().apply(profileRequestContext)) {
+            if (flow != null && flow.getReuseCondition().test(profileRequestContext)) {
                 resultToSelect = activeResult;
                 if (preferredPrincipalCtx == null || preferredPrincipalCtx.isAcceptable(activeResult)) {
                     break;
@@ -322,7 +322,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
         for (final AuthenticationFlowDescriptor flow : authenticationContext.getPotentialFlows().values()) {
             if (!authenticationContext.getIntermediateFlows().containsKey(flow.getId())) {
                 if (!authenticationContext.isPassive() || flow.isPassiveAuthenticationSupported()) {
-                    if (flow.apply(profileRequestContext)) {
+                    if (flow.test(profileRequestContext)) {
                         selectedFlow = flow;
                         if (preferredPrincipalCtx == null || preferredPrincipalCtx.isAcceptable(flow)) {
                             break;
@@ -413,7 +413,7 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
             if (predicate != null) {
                 for (final AuthenticationFlowDescriptor descriptor : potentialFlows.values()) {
                     if (!authenticationContext.getIntermediateFlows().containsKey(descriptor.getId())
-                            && predicate.apply(descriptor) && descriptor.apply(profileRequestContext)) {
+                            && predicate.test(descriptor) && descriptor.test(profileRequestContext)) {
                         if (!authenticationContext.isPassive() || descriptor.isPassiveAuthenticationSupported()) {
                             selectInactiveFlow(profileRequestContext, authenticationContext, descriptor);
                             return;
@@ -458,8 +458,8 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
                 if (predicate != null) {
                     for (final AuthenticationResult result : activeResults.values()) {
                         final AuthenticationFlowDescriptor flow = availableFlows.get(result.getAuthenticationFlowId());
-                        if (flow != null && flow.getReuseCondition().apply(profileRequestContext)
-                                && predicate.apply(result)) {
+                        if (flow != null && flow.getReuseCondition().test(profileRequestContext)
+                                && predicate.test(result)) {
                             selectActiveResult(profileRequestContext, authenticationContext, result);
                             return;
                         }
@@ -489,13 +489,13 @@ public class SelectAuthenticationFlow extends AbstractAuthenticationAction {
                 if (predicate != null) {
                     for (final AuthenticationFlowDescriptor descriptor : potentialFlows.values()) {
                         if (!authenticationContext.getIntermediateFlows().containsKey(descriptor.getId())
-                                && predicate.apply(descriptor) && descriptor.apply(profileRequestContext)) {
+                                && 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().apply(profileRequestContext)
-                                    || !predicate.apply(result)) {
+                            if (result == null || !descriptor.getReuseCondition().test(profileRequestContext)
+                                    || !predicate.test(result)) {
                                 if (!authenticationContext.isPassive()
                                         || descriptor.isPassiveAuthenticationSupported()) {
                                     selectInactiveFlow(profileRequestContext, authenticationContext, descriptor);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectSubjectCanonicalizationFlow.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectSubjectCanonicalizationFlow.java
index 9380ff8..6439f84 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectSubjectCanonicalizationFlow.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/SelectSubjectCanonicalizationFlow.java
@@ -100,7 +100,7 @@ public class SelectSubjectCanonicalizationFlow extends AbstractSubjectCanonicali
                 log.debug("{} Checking canonicalization flow {} for applicability...", getLogPrefix(),
                         flow.getId());
                 c14nContext.setAttemptedFlow(flow);
-                if (flow.apply(profileRequestContext)) {
+                if (flow.test(profileRequestContext)) {
                     return flow;
                 }
                 log.debug("{} Canonicalization flow {} was not applicable to this request", getLogPrefix(),
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 895fa24..dab0137 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -31,8 +32,6 @@ import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import org.opensaml.profile.action.ActionSupport;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * An action that operates on a {@link SubjectCanonicalizationContext} child of the current
  * {@link ProfileRequestContext}, and transforms the input {@link javax.security.auth.Subject}
@@ -82,8 +81,7 @@ public class SimpleSubjectCanonicalization extends AbstractSubjectCanonicalizati
     public static class ActivationCondition implements Predicate<ProfileRequestContext> {
 
         /** {@inheritDoc} */
-        @Override
-        public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
             
             if (input != null) {
                 final SubjectCanonicalizationContext c14nContext =
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 d6c3550..f6f7c8d 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.io.IOException;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -32,8 +33,6 @@ import org.opensaml.storage.StorageService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.AccountLockoutManager;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.LockoutManagerContext;
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 aceb31e..9e045db 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.authn.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -39,9 +41,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * An authentication action that acts as the master evaluation step regulating execution
  * of transitions between MFA stages.
@@ -104,9 +103,9 @@ public class TransitionMultiFactorAuthentication extends AbstractAuthenticationA
 
     /** Constructor. */
     TransitionMultiFactorAuthentication() {
-        multiFactorContextLookupStrategy = Functions.compose(
-                new ChildContextLookup(MultiFactorAuthenticationContext.class),
-                new ChildContextLookup(AuthenticationContext.class));
+        multiFactorContextLookupStrategy =
+                new ChildContextLookup(MultiFactorAuthenticationContext.class).compose(
+                        new ChildContextLookup(AuthenticationContext.class));
         
         eventContextLookupStrategy = new WebFlowCurrentEventLookupFunction();
         
@@ -267,7 +266,7 @@ public class TransitionMultiFactorAuthentication extends AbstractAuthenticationA
         // infinite recursion is the configuration of transitions supplied by the deployer.
         final AuthenticationResult activeResult = mfaContext.getActiveResults().get(flowId);
         if (activeResult != null) {
-            if (flow.getReuseCondition().apply(profileRequestContext)) {
+            if (flow.getReuseCondition().test(profileRequestContext)) {
                 log.debug("{} Reusing active result for '{}' flow", getLogPrefix(), flowId);
                 activeResult.setLastActivityInstantToNow();
                 ActionSupport.buildProceedEvent(profileRequestContext);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateFunctionResult.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateFunctionResult.java
index e9d86df..745762b 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateFunctionResult.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateFunctionResult.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.security.Principal;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +41,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An action that executes a deployer-supplied function and produces an
  * {@link net.shibboleth.idp.authn.AuthenticationResult} based on the function result.
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUsernamePasswordAgainstJAAS.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUsernamePasswordAgainstJAAS.java
index b7920b5..b4e814f 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUsernamePasswordAgainstJAAS.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateUsernamePasswordAgainstJAAS.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -53,8 +54,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An action that checks for a {@link net.shibboleth.idp.authn.context.UsernamePasswordContext} and directly produces an
  * {@link net.shibboleth.idp.authn.AuthenticationResult} based on that identity by invoking a JAAS configuration.
@@ -91,8 +90,7 @@ public class ValidateUsernamePasswordAgainstJAAS extends AbstractUsernamePasswor
     @Nonnull private Collection<Pair<String,Subject>> loginConfigurations;
     
     /** Strategy function to dynamically derive the login config(s) to use. */
-    @Nullable
-    private Function<ProfileRequestContext,Collection<Pair<String,Subject>>> loginConfigStrategy;
+    @Nullable private Function<ProfileRequestContext,Collection<Pair<String,Subject>>> loginConfigStrategy;
     
     /** Saved off context. */
     @Nullable private RequestedPrincipalContext requestedPrincipalCtx;
@@ -300,7 +298,7 @@ public class ValidateUsernamePasswordAgainstJAAS extends AbstractUsernamePasswor
                             return subject.getPrincipals(c);
                         }
                     };
-                    if (predicate.apply(wrapper)) {
+                    if (predicate.test(wrapper)) {
                         log.debug("{} JAAS config '{}' compatible with principal type '{}' and operator '{}'",
                                 getLogPrefix(), configName, p.getClass(), requestedPrincipalCtx.getOperator());
                         requestedPrincipalCtx.setMatchingPrincipal(predicate.getMatchingPrincipal());
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 63f1e16..f75a6ab 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
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -47,7 +48,6 @@ import org.opensaml.security.x509.X509Support;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -219,8 +219,7 @@ public class X500SubjectCanonicalization extends AbstractSubjectCanonicalization
     public static class ActivationCondition implements Predicate<ProfileRequestContext> {
 
         /** {@inheritDoc} */
-        @Override
-        public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
             
             if (input != null) {
                 final SubjectCanonicalizationContext c14nContext =
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactory.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactory.java
index 094b563..d9f1582 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactory.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactory.java
@@ -54,7 +54,7 @@ public class ExactPrincipalEvalPredicateFactory implements PrincipalEvalPredicat
         }
 
         /** {@inheritDoc} */
-        public boolean apply(final PrincipalSupportingComponent input) {
+        public boolean test(@Nullable final PrincipalSupportingComponent input) {
             return input != null && input.getSupportedPrincipals(principal.getClass()).contains(principal);
         }
 
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactory.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactory.java
index 6bdbbc1..5eece19 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactory.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactory.java
@@ -112,7 +112,7 @@ public class InexactPrincipalEvalPredicateFactory implements PrincipalEvalPredic
         }
 
         /** {@inheritDoc} */
-        public boolean apply(final PrincipalSupportingComponent input) {
+        public boolean test(@Nullable final PrincipalSupportingComponent input) {
             final Set<String> matches = matchingRules.get(principal.getName());
             final Set<? extends Principal> inputs = input.getSupportedPrincipals(principal.getClass());
             
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactoryTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactoryTest.java
index ef2e6d5..f1f1dca 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactoryTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/ExactPrincipalEvalPredicateFactoryTest.java
@@ -47,22 +47,22 @@ public class ExactPrincipalEvalPredicateFactoryTest {
         
     @Test public void testNoPrincipals() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
-        Assert.assertFalse(factory.getPredicate(foo).apply(sample));
+        Assert.assertFalse(factory.getPredicate(foo).test(sample));
     }
 
     @Test public void testOnePrincipal() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("foo"));
-        Assert.assertTrue(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
+        Assert.assertTrue(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
     }
 
     @Test public void testMultiplePrincipal() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("foo"));
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("baz"));
-        Assert.assertTrue(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
+        Assert.assertTrue(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactoryTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactoryTest.java
index 45aabeb..3328508 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactoryTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/InexactPrincipalEvalPredicateFactoryTest.java
@@ -55,33 +55,33 @@ public class InexactPrincipalEvalPredicateFactoryTest {
     @Test public void testNoPrincipals() {
         // Scenario: request for foo, result contains nothing, no match.
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
-        Assert.assertFalse(factory.getPredicate(foo).apply(sample));
+        Assert.assertFalse(factory.getPredicate(foo).test(sample));
     }
 
     @Test public void testOnePrincipalMatch() {
         // Scenario: result contains bar, request for foo matches, bar and baz do not
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("bar"));
-        Assert.assertTrue(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
-        Assert.assertFalse(factory.getPredicate(baz).apply(sample));
+        Assert.assertTrue(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
+        Assert.assertFalse(factory.getPredicate(baz).test(sample));
     }
 
     @Test public void testOnePrincipalNoMatch() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("foo"));
-        Assert.assertFalse(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
-        Assert.assertFalse(factory.getPredicate(baz).apply(sample));
+        Assert.assertFalse(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
+        Assert.assertFalse(factory.getPredicate(baz).test(sample));
     }
     
     @Test public void testMultiplePrincipalMatch() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("bar"));
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("baz"));
-        Assert.assertTrue(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
-        Assert.assertFalse(factory.getPredicate(baz).apply(sample));
+        Assert.assertTrue(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
+        Assert.assertFalse(factory.getPredicate(baz).test(sample));
     }
 
     @Test public void testMultiplePrincipalMatchMap() {
@@ -90,17 +90,17 @@ public class InexactPrincipalEvalPredicateFactoryTest {
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("baz"));
         InexactPrincipalEvalPredicateFactory mapFactory = new InexactPrincipalEvalPredicateFactory();
         mapFactory.setMatchingRules(factory.getMatchingRules().asMap());
-        Assert.assertTrue(mapFactory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(mapFactory.getPredicate(bar).apply(sample));
-        Assert.assertFalse(mapFactory.getPredicate(baz).apply(sample));
+        Assert.assertTrue(mapFactory.getPredicate(foo).test(sample));
+        Assert.assertFalse(mapFactory.getPredicate(bar).test(sample));
+        Assert.assertFalse(mapFactory.getPredicate(baz).test(sample));
     }
 
     @Test public void testMultiplePrincipalNoMatch() {
         AuthenticationResult sample = new AuthenticationResult("test", new Subject());
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("foo"));
         sample.getSubject().getPrincipals().add(new UsernamePrincipal("baz"));
-        Assert.assertFalse(factory.getPredicate(foo).apply(sample));
-        Assert.assertFalse(factory.getPredicate(bar).apply(sample));
-        Assert.assertFalse(factory.getPredicate(baz).apply(sample));
+        Assert.assertFalse(factory.getPredicate(foo).test(sample));
+        Assert.assertFalse(factory.getPredicate(bar).test(sample));
+        Assert.assertFalse(factory.getPredicate(baz).test(sample));
     }
 }
\ No newline at end of file
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/TicketPrincipalLookupFunction.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/TicketPrincipalLookupFunction.java
index fec8bd9..2648fbe 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/TicketPrincipalLookupFunction.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/TicketPrincipalLookupFunction.java
@@ -17,13 +17,14 @@
 
 package net.shibboleth.idp.cas.ticket;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -39,9 +40,9 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class TicketPrincipalLookupFunction implements Function<ProfileRequestContext, String> {
 
     /** Ticket context lookup function. */
-    private Function<ProfileRequestContext, TicketContext> ticketContextLookupFunction = Functions.compose(
-            new ChildContextLookup<>(TicketContext.class),
-            new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+    @Nonnull private Function<ProfileRequestContext,TicketContext> ticketContextLookupFunction =
+            new ChildContextLookup<>(TicketContext.class).compose(
+                    new ChildContextLookup<>(ProtocolContext.class));
 
 
     /**
@@ -49,13 +50,12 @@ public class TicketPrincipalLookupFunction implements Function<ProfileRequestCon
      *
      * @param function Ticket context lookup function.
      */
-    public void setTicketContextLookupFunction(@Nonnull final Function<ProfileRequestContext, TicketContext> function) {
+    public void setTicketContextLookupFunction(@Nonnull final Function<ProfileRequestContext,TicketContext> function) {
         ticketContextLookupFunction = Constraint.isNotNull(function, "Ticket lookup function cannot be null");
     }
 
-    @Nullable
-    @Override
-    public String apply(@Nullable final ProfileRequestContext profileRequestContext) {
+    /** {@inheritDoc} */
+    @Nullable public String apply(@Nullable final ProfileRequestContext profileRequestContext) {
         final TicketContext tc = ticketContextLookupFunction.apply(profileRequestContext);
         if (tc != null) {
             final TicketState state = tc.getTicket().getTicketState();
@@ -65,4 +65,5 @@ public class TicketPrincipalLookupFunction implements Function<ProfileRequestCon
         }
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/GatewayLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/GatewayLookupFunction.java
index 830ad59..833ed2e 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/GatewayLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/GatewayLookupFunction.java
@@ -17,13 +17,15 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.protocol.ServiceTicketRequest;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -32,13 +34,13 @@ import org.opensaml.profile.context.ProfileRequestContext;
  *
  * @author Marvin S. Addison
  */
-public class GatewayLookupFunction implements Function<ProfileRequestContext, Boolean> {
+public class GatewayLookupFunction implements Function<ProfileRequestContext,Boolean> {
     /** Lookup strategy for protocol context. */
-    @Nonnull private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public GatewayLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<ProfileRequestContext,ProtocolContext>(ProtocolContext.class));
     }
 
     /**
@@ -50,13 +52,8 @@ public class GatewayLookupFunction implements Function<ProfileRequestContext, Bo
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
-    /**
-     * Whether the gateway parameter is true.
-     * 
-     * {@inheritDoc}
-     */
-    @Nullable @Override
-    public Boolean apply(@Nonnull final ProfileRequestContext input) {
+    /** {@inheritDoc} */
+    @Nullable public Boolean apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -67,4 +64,5 @@ public class GatewayLookupFunction implements Function<ProfileRequestContext, Bo
         }
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ProxyGrantingTicketLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ProxyGrantingTicketLookupFunction.java
index 1551a05..ef1793d 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ProxyGrantingTicketLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ProxyGrantingTicketLookupFunction.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.protocol.ProxyTicketRequest;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -32,14 +33,13 @@ import org.opensaml.profile.context.ProfileRequestContext;
  *
  * @author Marvin S. Addison
  */
-public class ProxyGrantingTicketLookupFunction implements Function<ProfileRequestContext, String> {
+public class ProxyGrantingTicketLookupFunction implements Function<ProfileRequestContext,String> {
     /** Lookup strategy for protocol context. */
-    @Nonnull
-    private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public ProxyGrantingTicketLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -48,7 +48,7 @@ public class ProxyGrantingTicketLookupFunction implements Function<ProfileReques
      * @param protocolLookup lookup strategy for protocol context
      */
     public ProxyGrantingTicketLookupFunction(
-            @Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+            @Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -57,8 +57,7 @@ public class ProxyGrantingTicketLookupFunction implements Function<ProfileReques
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public String apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -69,4 +68,5 @@ public class ProxyGrantingTicketLookupFunction implements Function<ProfileReques
         }
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/RenewLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/RenewLookupFunction.java
index c341d39..1d7baef 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/RenewLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/RenewLookupFunction.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.protocol.ServiceTicketRequest;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -35,11 +36,11 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class RenewLookupFunction implements Function<ProfileRequestContext, Boolean> {
     /** Lookup strategy for protocol context. */
     @Nonnull
-    private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public RenewLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -47,7 +48,7 @@ public class RenewLookupFunction implements Function<ProfileRequestContext, Bool
      *
      * @param protocolLookup lookup strategy for protocol context
      */
-    public RenewLookupFunction(@Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+    public RenewLookupFunction(@Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -56,8 +57,7 @@ public class RenewLookupFunction implements Function<ProfileRequestContext, Bool
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public Boolean apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public Boolean apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -68,4 +68,5 @@ public class RenewLookupFunction implements Function<ProfileRequestContext, Bool
         }
         throw new IllegalArgumentException("Unsupported request type: " + request);
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ServiceLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ServiceLookupFunction.java
index ff68613..38afbff 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ServiceLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/ServiceLookupFunction.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.protocol.ProxyTicketRequest;
 import net.shibboleth.idp.cas.protocol.ServiceTicketRequest;
@@ -35,12 +36,13 @@ import org.opensaml.profile.context.ProfileRequestContext;
  * @author Marvin S. Addison
  */
 public class ServiceLookupFunction implements Function<ProfileRequestContext, String> {
+    
     /** Lookup strategy for protocol context. */
-    @Nonnull private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public ServiceLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -48,7 +50,7 @@ public class ServiceLookupFunction implements Function<ProfileRequestContext, St
      *
      * @param protocolLookup lookup strategy for protocol context
      */
-    public ServiceLookupFunction(@Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+    public ServiceLookupFunction(@Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -57,8 +59,7 @@ public class ServiceLookupFunction implements Function<ProfileRequestContext, St
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public String apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -76,4 +77,5 @@ public class ServiceLookupFunction implements Function<ProfileRequestContext, St
         }
         return service;
     }
-}
+
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusCodeLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusCodeLookupFunction.java
index 679285b..d3b8f0f 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusCodeLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusCodeLookupFunction.java
@@ -17,12 +17,14 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.AbstractProtocolResponse;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -36,14 +38,14 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class StatusCodeLookupFunction implements Function<ProfileRequestContext, String> {
 
     /** Synthetic success result code. */
-    public static final String SUCCESS_CODE = "SUCCESS";
+    @Nonnull @NotEmpty public static final String SUCCESS_CODE = "SUCCESS";
 
     /** Lookup strategy for protocol context. */
-    @Nonnull private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public StatusCodeLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -51,7 +53,7 @@ public class StatusCodeLookupFunction implements Function<ProfileRequestContext,
      *
      * @param protocolLookup lookup strategy for protocol context
      */
-    public StatusCodeLookupFunction(@Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+    public StatusCodeLookupFunction(@Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -60,8 +62,7 @@ public class StatusCodeLookupFunction implements Function<ProfileRequestContext,
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public String apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -73,4 +74,5 @@ public class StatusCodeLookupFunction implements Function<ProfileRequestContext,
         }
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusDetailLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusDetailLookupFunction.java
index ad92370..6065dbb 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusDetailLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/StatusDetailLookupFunction.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.AbstractProtocolResponse;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -33,14 +34,14 @@ import org.opensaml.profile.context.ProfileRequestContext;
  *
  * @author Marvin S. Addison
  */
-public class StatusDetailLookupFunction implements Function<ProfileRequestContext, String> {
+public class StatusDetailLookupFunction implements Function<ProfileRequestContext,String> {
 
     /** Lookup strategy for protocol context. */
-    @Nonnull private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public StatusDetailLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -48,7 +49,7 @@ public class StatusDetailLookupFunction implements Function<ProfileRequestContex
      *
      * @param protocolLookup lookup strategy for protocol context
      */
-    public StatusDetailLookupFunction(@Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+    public StatusDetailLookupFunction(@Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -57,8 +58,7 @@ public class StatusDetailLookupFunction implements Function<ProfileRequestContex
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public String apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -69,4 +69,5 @@ public class StatusDetailLookupFunction implements Function<ProfileRequestContex
         }
         return null;
     }
-}
+
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/TicketLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/TicketLookupFunction.java
index 3dc25b5..d72b09e 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/TicketLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/audit/impl/TicketLookupFunction.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.cas.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.protocol.ProxyTicketResponse;
 import net.shibboleth.idp.cas.protocol.ServiceTicketResponse;
@@ -35,12 +36,13 @@ import org.opensaml.profile.context.ProfileRequestContext;
  * @author Marvin S. Addison
  */
 public class TicketLookupFunction implements Function<ProfileRequestContext, String> {
+    
     /** Lookup strategy for protocol context. */
-    @Nonnull private final Function<ProfileRequestContext, ProtocolContext> protocolContextFunction;
+    @Nonnull private final Function<ProfileRequestContext,ProtocolContext> protocolContextFunction;
 
     /** Constructor. */
     public TicketLookupFunction() {
-        this(new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+        this(new ChildContextLookup<>(ProtocolContext.class));
     }
 
     /**
@@ -48,7 +50,7 @@ public class TicketLookupFunction implements Function<ProfileRequestContext, Str
      *
      * @param protocolLookup lookup strategy for protocol context
      */
-    public TicketLookupFunction(@Nonnull final Function<ProfileRequestContext, ProtocolContext> protocolLookup) {
+    public TicketLookupFunction(@Nonnull final Function<ProfileRequestContext,ProtocolContext> protocolLookup) {
         protocolContextFunction = Constraint.isNotNull(protocolLookup, "ProtocolContext lookup cannot be null");
     }
 
@@ -57,8 +59,7 @@ public class TicketLookupFunction implements Function<ProfileRequestContext, Str
      * 
      * {@inheritDoc}
      */
-    @Nullable @Override
-    public String apply(@Nonnull final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final ProtocolContext protocolContext = protocolContextFunction.apply(input);
         if (protocolContext == null || protocolContext.getRequest() ==  null) {
             return null;
@@ -77,4 +78,5 @@ public class TicketLookupFunction implements Function<ProfileRequestContext, Str
         }
         return ticket;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/AbstractProtocolConfiguration.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/AbstractProtocolConfiguration.java
index e319fcc..02a84eb 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/AbstractProtocolConfiguration.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/AbstractProtocolConfiguration.java
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.cas.config.impl;
 
 import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,8 +36,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -132,7 +132,7 @@ public abstract class AbstractProtocolConfiguration extends AbstractConditionalP
      */
     @Deprecated
     public boolean isResolveAttributes() {
-        return resolveAttributesPredicate.apply(getProfileRequestContext());
+        return resolveAttributesPredicate.test(getProfileRequestContext());
     }
 
     /**
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ConfigLookupFunction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ConfigLookupFunction.java
index 6554f8e..6ff3869 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ConfigLookupFunction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ConfigLookupFunction.java
@@ -17,10 +17,12 @@
 
 package net.shibboleth.idp.cas.config.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
+
 import org.opensaml.profile.context.ProfileRequestContext;
 
 /**
@@ -45,9 +47,8 @@ public class ConfigLookupFunction<T extends AbstractProtocolConfiguration>
         configClass = clazz;
     }
 
-    @Override
-    @Nullable
-    public T apply(@Nullable final ProfileRequestContext profileRequestContext) {
+    /** {@inheritDoc} */
+    @Nullable public T apply(@Nullable final ProfileRequestContext profileRequestContext) {
         if (profileRequestContext != null) {
             final RelyingPartyContext rpContext = profileRequestContext.getSubcontext(RelyingPartyContext.class, false);
             if (rpContext != null && configClass.isInstance(rpContext.getProfileConfig())) {
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/LoginConfiguration.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/LoginConfiguration.java
index d84ac33..e60b5dc 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/LoginConfiguration.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/LoginConfiguration.java
@@ -24,14 +24,14 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ValidateConfiguration.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ValidateConfiguration.java
index 0eabf72..d345afc 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ValidateConfiguration.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/config/impl/ValidateConfiguration.java
@@ -18,14 +18,13 @@
 package net.shibboleth.idp.cas.config.impl;
 
 import java.util.Comparator;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.cas.service.impl.DefaultServiceComparator;
 import net.shibboleth.idp.cas.ticket.impl.TicketIdentifierGenerationStrategy;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/AbstractCASProtocolAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/AbstractCASProtocolAction.java
index eba2e3b..d5aaaff 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/AbstractCASProtocolAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/AbstractCASProtocolAction.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.cas.flow.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.service.Service;
 import net.shibboleth.idp.cas.service.ServiceContext;
@@ -41,7 +42,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public abstract class AbstractCASProtocolAction<RequestType, ResponseType> extends AbstractProfileAction {
 
     /** Looks up a CAS protocol context from IdP profile request context. */
-    private final Function<ProfileRequestContext, ProtocolContext<RequestType, ResponseType>> protocolLookupFunction;
+    private final Function<ProfileRequestContext,ProtocolContext<RequestType,ResponseType>> protocolLookupFunction;
 
     /** Constructor. */
     public AbstractCASProtocolAction() {
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
index 55e332a..1ccccdf 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildAuthenticationContextAction.java
@@ -53,7 +53,7 @@ public class BuildAuthenticationContextAction extends
         if (!ac.isForceAuthn()) {
             final LoginConfiguration config = configLookupFunction.apply(profileRequestContext);
             if (config != null) {
-                ac.setForceAuthn(config.getForceAuthnPredicate().apply(profileRequestContext));
+                ac.setForceAuthn(config.getForceAuthnPredicate().test(profileRequestContext));
             }
         }
         
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildRelyingPartyContextAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildRelyingPartyContextAction.java
index 9833e60..0ea94d2 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildRelyingPartyContextAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/BuildRelyingPartyContextAction.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.cas.flow.impl;
 import java.util.Arrays;
 import java.util.List;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import net.shibboleth.idp.cas.protocol.ProxyTicketRequest;
 import net.shibboleth.idp.cas.protocol.ServiceTicketRequest;
@@ -98,8 +99,16 @@ public class BuildRelyingPartyContextAction extends AbstractCASProtocolAction {
         return null;
     }
 
-    private Service query(final String serviceURL) {
-        for (ServiceRegistry registry : serviceRegistries) {
+    /**
+     * Query service registry based on URL.
+     * 
+     * @param serviceURL the URL
+     * 
+     * @return the result of the lookup or null
+     */
+    @Nullable private Service query(final String serviceURL) {
+        
+        for (final ServiceRegistry registry : serviceRegistries) {
             log.debug("Querying {} for CAS service URL {}", registry.getClass().getName(), serviceURL);
             final Service service = registry.lookup(serviceURL);
             if (service != null) {
@@ -108,4 +117,5 @@ public class BuildRelyingPartyContextAction extends AbstractCASProtocolAction {
         }
         return null;
     }
-}
+    
+}
\ No newline at end of file
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantProxyTicketAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantProxyTicketAction.java
index dcdc587..4cd05b5 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantProxyTicketAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantProxyTicketAction.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.cas.flow.impl;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import net.shibboleth.idp.cas.config.impl.ConfigLookupFunction;
 import net.shibboleth.idp.cas.config.impl.ProxyConfiguration;
@@ -121,7 +122,7 @@ public class GrantProxyTicketAction extends AbstractCASProtocolAction<ProxyTicke
             log.warn("Invalid proxy ticket configuration: SecurityConfiguration#idGenerator undefined");
             return ProtocolError.IllegalState.event(this);
         }
-        if (validateIdPSessionPredicate.apply(profileRequestContext)) {
+        if (validateIdPSessionPredicate.test(profileRequestContext)) {
             IdPSession session = null;
             try {
                 log.debug("Attempting to retrieve session {}", pgt.getSessionId());
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantServiceTicketAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantServiceTicketAction.java
index f583be9..e013e7f 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantServiceTicketAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/GrantServiceTicketAction.java
@@ -17,10 +17,10 @@
 
 package net.shibboleth.idp.cas.flow.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import net.shibboleth.idp.authn.AuthenticationResult;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.SubjectContext;
@@ -57,16 +57,16 @@ import org.springframework.webflow.execution.RequestContext;
 public class GrantServiceTicketAction extends AbstractCASProtocolAction<ServiceTicketRequest, ServiceTicketResponse> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(GrantServiceTicketAction.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(GrantServiceTicketAction.class);
 
     /** Profile configuration lookup function. */
-    private final ConfigLookupFunction<LoginConfiguration> configLookupFunction =
+    @Nonnull private final ConfigLookupFunction<LoginConfiguration> configLookupFunction =
             new ConfigLookupFunction<>(LoginConfiguration.class);
 
     /** Looks up an IdP session context from IdP profile request context. */
     @Nonnull
     private final Function<ProfileRequestContext, SessionContext> sessionContextFunction =
-            new ChildContextLookup<>(SessionContext.class, false);
+            new ChildContextLookup<>(SessionContext.class);
 
     /** AuthenticationContext lookup function. */
     @Nonnull
@@ -75,9 +75,9 @@ public class GrantServiceTicketAction extends AbstractCASProtocolAction<ServiceT
 
     /** Function to retrieve subject principal name. */
     @Nonnull
-    private final Function<ProfileRequestContext, String> principalLookupFunction = Functions.compose(
-            new SubjectContextPrincipalLookupFunction(),
-            new ChildContextLookup<ProfileRequestContext, SubjectContext>(SubjectContext.class));
+    private final Function<ProfileRequestContext, String> principalLookupFunction =
+            new SubjectContextPrincipalLookupFunction().compose(
+                    new ChildContextLookup<>(SubjectContext.class));
 
     /** Manages CAS tickets. */
     @Nonnull
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/PrepareTicketValidationResponseAction.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/PrepareTicketValidationResponseAction.java
index b3f538a..208fbee 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/PrepareTicketValidationResponseAction.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/flow/impl/PrepareTicketValidationResponseAction.java
@@ -17,10 +17,10 @@
 
 package net.shibboleth.idp.cas.flow.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.context.AttributeContext;
@@ -51,19 +51,20 @@ public class PrepareTicketValidationResponseAction extends
         AbstractCASProtocolAction<TicketValidationRequest, TicketValidationResponse> {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(PrepareTicketValidationResponseAction.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(PrepareTicketValidationResponseAction.class);
 
     /** Function used to retrieve AttributeContext. */
+    @Nonnull
     private Function<ProfileRequestContext,AttributeContext> attributeContextFunction =
-            Functions.compose(
-                    new ChildContextLookup<>(AttributeContext.class, true),
-                    new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(RelyingPartyContext.class));
+            new ChildContextLookup<>(AttributeContext.class, true).compose(
+                    new ChildContextLookup<>(RelyingPartyContext.class));
 
     /** Function used to retrieve subject principal. */
-    private Function<ProfileRequestContext,String> principalLookupFunction = new TicketPrincipalLookupFunction();
+    @Nonnull private Function<ProfileRequestContext,String> principalLookupFunction =
+            new TicketPrincipalLookupFunction();
 
     /** Profile configuration lookup function. */
-    private final ConfigLookupFunction<ValidateConfiguration> configLookupFunction =
+    @Nonnull private final ConfigLookupFunction<ValidateConfiguration> configLookupFunction =
             new ConfigLookupFunction<>(ValidateConfiguration.class);
 
 
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidator.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidator.java
index b4ec3d0..e24708a 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidator.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidator.java
@@ -25,6 +25,7 @@ import java.security.GeneralSecurityException;
 import java.security.cert.CertificateException;
 import java.util.Collections;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.net.ssl.SSLException;
@@ -32,8 +33,6 @@ import javax.net.ssl.SSLPeerUnverifiedException;
 import javax.security.auth.login.CredentialException;
 import javax.security.auth.login.FailedLoginException;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import net.shibboleth.idp.cas.config.impl.AbstractProtocolConfiguration;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.proxy.ProxyValidator;
@@ -43,11 +42,13 @@ import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElemen
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.protocol.HttpClientContext;
+
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -60,6 +61,7 @@ import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.x509.TrustedNamesCriterion;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,26 +81,24 @@ import org.slf4j.LoggerFactory;
 public class HttpClientProxyValidator implements ProxyValidator {
 
     /** Required https scheme for proxy callbacks. */
-    protected static final String HTTPS_SCHEME = "https";
+    @Nonnull @NotEmpty protected static final String HTTPS_SCHEME = "https";
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HttpClientProxyValidator.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HttpClientProxyValidator.class);
 
     /** Looks up a ServiceContext from the profile request context. */
-    private final Function<ProfileRequestContext, ServiceContext> serviceCtxLookupFunction = Functions.compose(
-            new ChildContextLookup<ProtocolContext, ServiceContext>(ServiceContext.class),
-            new ChildContextLookup<ProfileRequestContext, ProtocolContext>(ProtocolContext.class));
+    @Nonnull private final Function<ProfileRequestContext,ServiceContext> serviceCtxLookupFunction =
+            new ChildContextLookup<>(ServiceContext.class).compose(
+                    new ChildContextLookup<>(ProtocolContext.class));
 
     /** HTTP client that connects to proxy callback endpoint. */
-    private final HttpClient httpClient;
+    @Nonnull private final HttpClient httpClient;
 
     /** HTTP client security parameters. */
-    private final HttpClientSecurityParameters securityParameters;
+    @Nonnull private final HttpClientSecurityParameters securityParameters;
 
     /** List of HTTP response codes permitted for successful proxy callback. */
-    @NotEmpty
-    @NonnullElements
-    private Set<Integer> allowedResponseCodes = Collections.singleton(200);
+    @NotEmpty @NonnullElements private Set<Integer> allowedResponseCodes = Collections.singleton(200);
 
 
     /**
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistry.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistry.java
index fb2cdc2..319de14 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistry.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistry.java
@@ -18,11 +18,11 @@
 package net.shibboleth.idp.cas.service.impl;
 
 import java.util.List;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import net.shibboleth.idp.cas.config.impl.AbstractProtocolConfiguration;
 import net.shibboleth.idp.cas.config.impl.LoginConfiguration;
@@ -202,8 +202,9 @@ public class MetadataServiceRegistry implements ServiceRegistry {
      * set needed to support CAS entities in SAML metadata.
      */
     public static class LoginEndpointPredicate implements Predicate<Endpoint> {
-        @Override
-        public boolean apply(@Nullable final Endpoint endpoint) {
+        
+        /** {@inheritDoc} */
+        public boolean test(@Nullable final Endpoint endpoint) {
             return LOGIN_BINDING.equals(endpoint.getBinding());
         }
     }
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/BuildSAMLMetadataContextActionTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/BuildSAMLMetadataContextActionTest.java
index a124f47..fb9770f 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/BuildSAMLMetadataContextActionTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/BuildSAMLMetadataContextActionTest.java
@@ -18,8 +18,8 @@
 package net.shibboleth.idp.cas.flow.impl;
 
 import java.util.List;
+import java.util.function.Function;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.cas.config.impl.LoginConfiguration;
 import net.shibboleth.idp.cas.service.Service;
 import net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLookupFunction;
diff --git a/idp-conf/src/main/resources/conf/cas-protocol.xml b/idp-conf/src/main/resources/conf/cas-protocol.xml
index 535cf0a..92eb65c 100644
--- a/idp-conf/src/main/resources/conf/cas-protocol.xml
+++ b/idp-conf/src/main/resources/conf/cas-protocol.xml
@@ -74,9 +74,7 @@
        | evaluates to true under any condition, a server-side storage service must be enabled for IdP session
        | storage. The most common non-default value is "alwaysTrue."
        -->
-    <bean id="shibboleth.CASProxyValidateIdPSessionPredicate"
-          class="com.google.common.base.Predicates"
-          factory-method="alwaysFalse" />
+    <bean id="shibboleth.CASProxyValidateIdPSessionPredicate" parent="shibboleth.Conditions.FALSE" />
 
     <!--
        | Uncomment the following bean if you want to ignore jsessionid artifacts in service URLs.
diff --git a/idp-conf/src/main/resources/conf/intercept/consent-intercept-config.xml b/idp-conf/src/main/resources/conf/intercept/consent-intercept-config.xml
index a089211..66f06a0 100644
--- a/idp-conf/src/main/resources/conf/intercept/consent-intercept-config.xml
+++ b/idp-conf/src/main/resources/conf/intercept/consent-intercept-config.xml
@@ -24,8 +24,7 @@
     <alias alias="shibboleth.consent.terms-of-use.Key" name="shibboleth.RelyingPartyIdLookup.Simple" />
     
     <!--
-    <bean id="shibboleth.consent.terms-of-use.Key"
-            class="com.google.common.base.Functions" factory-method="compose">
+    <bean id="shibboleth.consent.terms-of-use.Key" parent="shibboleth.Functions.Compose">
         <constructor-arg name="g">
             <bean class="com.google.common.base.Functions" factory-method="forMap" c:defaultValue="terms-of-use">
                 <constructor-arg name="map">
diff --git a/idp-conf/src/main/resources/conf/logback.xml b/idp-conf/src/main/resources/conf/logback.xml
index cda207e..14cbba0 100644
--- a/idp-conf/src/main/resources/conf/logback.xml
+++ b/idp-conf/src/main/resources/conf/logback.xml
@@ -21,11 +21,11 @@
     <!-- <variable name="idp.process.appender" value="ASYNC_PROCESS" /> -->
     
     <!-- Logging level shortcuts. -->
-    <variable name="idp.loglevel.idp" value="${idp.loglevel.idp:-INFO}" />
-    <variable name="idp.loglevel.ldap" value="${idp.loglevel.ldap:-WARN}" />
+    <variable name="idp.loglevel.idp" value="${idp.loglevel.idp:-DEBUG}" />
+    <variable name="idp.loglevel.ldap" value="${idp.loglevel.ldap:-DEBUG}" />
     <variable name="idp.loglevel.messages" value="${idp.loglevel.messages:-INFO}" />
     <variable name="idp.loglevel.encryption" value="${idp.loglevel.encryption:-INFO}" />
-    <variable name="idp.loglevel.opensaml" value="${idp.loglevel.opensaml:-INFO}" />
+    <variable name="idp.loglevel.opensaml" value="${idp.loglevel.opensaml:-DEBUG}" />
     <variable name="idp.loglevel.props" value="${idp.loglevel.props:-INFO}" />
     <variable name="idp.loglevel.httpclient" value="${idp.loglevel.httpclient:-INFO}" />
     
diff --git a/idp-conf/src/main/resources/system/conf/audit-system.xml b/idp-conf/src/main/resources/system/conf/audit-system.xml
index acb49dd..d1bf2e2 100644
--- a/idp-conf/src/main/resources/system/conf/audit-system.xml
+++ b/idp-conf/src/main/resources/system/conf/audit-system.xml
@@ -23,7 +23,7 @@
     </bean>
     
     <!-- Controls which profiles get audited. -->
-    <bean id="shibboleth.ProfileAuditingCondition" class="com.google.common.base.Predicates" factory-method="not">
+    <bean id="shibboleth.ProfileAuditingCondition" parent="shibboleth.Conditions.NOT">
         <constructor-arg>
             <bean class="net.shibboleth.utilities.java.support.logic.StrategyIndirectedPredicate">
                 <constructor-arg name="objectStrategy">
@@ -37,14 +37,14 @@
     </bean>
     
     <!-- Reusable bean for extracting a username and hashing it for F-TICKS. -->
-    <bean id="shibboleth.UsernameHasher" class="com.google.common.base.Functions" factory-method="compose">
+    <bean id="shibboleth.UsernameHasher" parent="shibboleth.Functions.Compose">
         <constructor-arg name="g">
             <bean class="net.shibboleth.utilities.java.support.codec.StringDigester"
                 c:algorithm="#{'%{idp.fticks.algorithm:SHA-256}'.trim()}" c:format="HEX_LOWER"
                 p:salt="%{idp.fticks.salt:}" p:requireSalt="true" />
         </constructor-arg>
         <constructor-arg name="f">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
                     <bean class="net.shibboleth.idp.authn.context.navigate.SubjectContextPrincipalLookupFunction" />
                 </constructor-arg>
@@ -69,20 +69,20 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.PROTOCOL"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="constant"
-                        c:value-ref="shibboleth.MetadataLookup.Protocol" />
+                    <bean parent="shibboleth.Functions.Constant"
+                        c:target-ref="shibboleth.MetadataLookup.Protocol" />
                 </entry>
                 <entry>
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.REQUEST_BINDING"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLBindingContextBindingFunction"
                                 p:useShortName="%{idp.audit.shortenBindings:false}" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookup.SAMLBindingContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -92,12 +92,12 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.REQUEST_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLMessageInfoContextIDFunction" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookupOrCreate.SAMLMessageInfoContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -107,12 +107,12 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.REQUEST_ISSUE_INSTANT"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLMessageInfoContextIssueInstantFunction" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookupOrCreate.SAMLMessageInfoContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -124,7 +124,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.InResponseToAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -136,7 +136,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.StatusCodeAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -148,7 +148,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.SubStatusCodeAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -160,7 +160,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.StatusMessageAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -172,7 +172,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.IsPassiveAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.AuthnRequest"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -184,7 +184,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.ForceAuthnAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.AuthnRequest"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -224,7 +224,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.AssertionIDAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -236,7 +236,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.AssertionInstantAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -248,7 +248,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.AuthnInstantAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -260,7 +260,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.SessionIndexAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -272,7 +272,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.AuthnContextAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -284,7 +284,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.NameIDAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -296,7 +296,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.NameIDFormatAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -316,7 +316,7 @@
 	                        </bean>
                         </constructor-arg>
                         <constructor-arg name="f">
-		                    <bean class="com.google.common.base.Functions" factory-method="compose">
+		                    <bean parent="shibboleth.Functions.Compose">
 		                        <constructor-arg name="g">
 		                            <ref bean="shibboleth.ChildLookup.EncryptionParameters" />
 		                        </constructor-arg>
@@ -345,7 +345,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.authn.AuthnAuditFields.SSO"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.authn.context.navigate.PreviousResultLookupFunction" />
                         </constructor-arg>
@@ -358,7 +358,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -372,7 +372,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
@@ -403,13 +403,13 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.RESPONSE_BINDING"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLBindingContextBindingFunction"
                                 p:useShortName="%{idp.audit.shortenBindings:false}" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookup.SAMLBindingContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -419,12 +419,12 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.RESPONSE_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLMessageInfoContextIDFunction" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookupOrCreate.SAMLMessageInfoContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -434,12 +434,12 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.RESPONSE_ISSUE_INSTANT"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLMessageInfoContextIssueInstantFunction" />
                         </constructor-arg>
                         <constructor-arg name="f">
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.ChildLookupOrCreate.SAMLMessageInfoContext"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -451,7 +451,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.InResponseToAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -463,7 +463,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.StatusCodeAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -475,7 +475,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.SubStatusCodeAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -487,7 +487,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.StatusMessageAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
                         </constructor-arg>
@@ -507,7 +507,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.NameIDAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -519,7 +519,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.NameIDFormatAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -531,7 +531,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.SessionIndexAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -541,7 +541,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
@@ -562,7 +562,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -576,7 +576,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
@@ -591,7 +591,7 @@
                     </key>
                     <bean class="net.shibboleth.idp.saml.audit.impl.NameIDAuditExtractor">
                         <constructor-arg>
-                            <bean class="com.google.common.base.Functions" factory-method="compose"
+                            <bean parent="shibboleth.Functions.Compose"
                                 c:g-ref="shibboleth.MessageLookup.SAMLObject"
                                 c:f-ref="shibboleth.MessageContextLookup.Inbound" />
                         </constructor-arg>
@@ -615,7 +615,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.authn.AuthnAuditFields.SSO"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.authn.context.navigate.PreviousResultLookupFunction" />
                         </constructor-arg>
@@ -628,7 +628,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -642,7 +642,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
@@ -669,7 +669,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.authn.AuthnAuditFields.SSO"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.authn.context.navigate.PreviousResultLookupFunction" />
                         </constructor-arg>
@@ -682,7 +682,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                           c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                           c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -696,7 +696,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.cas.protocol.CASAuditFields.USER"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                           c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                           c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -722,7 +722,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
@@ -749,7 +749,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                           c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                           c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -763,7 +763,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.cas.protocol.CASAuditFields.USER"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                           c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                           c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
@@ -777,7 +777,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.SESSION_ID"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextIDLookupFunction" />
                         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml b/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
index d52702f..75c0605 100644
--- a/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
+++ b/idp-conf/src/main/resources/system/conf/cas-protocol-system.xml
@@ -60,9 +60,7 @@
           c:client-ref="proxyHttpClient"
           c:parameters-ref="proxyHttpSecurity" />
 
-    <bean id="shibboleth.DefaultCASProxyValidateIdPSessionPredicate"
-          class="com.google.common.base.Predicates"
-          factory-method="alwaysFalse" />
+    <bean id="shibboleth.DefaultCASProxyValidateIdPSessionPredicate" parent="shibboleth.Conditions.FALSE" />
 
     <bean id="shibboleth.DefaultCASServiceComparator"
           class="net.shibboleth.idp.cas.service.impl.DefaultServiceComparator" />
diff --git a/idp-conf/src/main/resources/system/conf/global-system.xml b/idp-conf/src/main/resources/system/conf/global-system.xml
index f6e1ecb..1ec7f19 100644
--- a/idp-conf/src/main/resources/system/conf/global-system.xml
+++ b/idp-conf/src/main/resources/system/conf/global-system.xml
@@ -25,6 +25,8 @@
                 <bean class="net.shibboleth.ext.spring.config.BooleanToPredicateConverter" />
                 <bean class="net.shibboleth.ext.spring.config.StringBooleanToPredicateConverter" />
                 <bean class="net.shibboleth.ext.spring.config.StringToResourceConverter" />
+                <bean class="net.shibboleth.ext.spring.config.FunctionToFunctionConverter" />
+                <bean class="net.shibboleth.ext.spring.config.PredicateToPredicateConverter" />
             </set>
         </property>
     </bean>
diff --git a/idp-conf/src/main/resources/system/conf/profile-intercept-system.xml b/idp-conf/src/main/resources/system/conf/profile-intercept-system.xml
index cdf1add..0c70290 100644
--- a/idp-conf/src/main/resources/system/conf/profile-intercept-system.xml
+++ b/idp-conf/src/main/resources/system/conf/profile-intercept-system.xml
@@ -75,8 +75,7 @@
         p:nonBrowserSupported="false" />
 
     <!-- Function to lookup consent-specific audit context as a child of the consent context. -->
-    <bean id="shibboleth.consent.ChildLookup.ConsentAuditContext"
-        class="com.google.common.base.Functions" factory-method="compose">
+    <bean id="shibboleth.consent.ChildLookup.ConsentAuditContext" parent="shibboleth.Functions.Compose">
         <constructor-arg name="g">
             <bean id="shibboleth.ChildLookup.AuditContext"
                 class="org.opensaml.messaging.context.navigate.ChildContextLookup"
@@ -99,7 +98,7 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.USERNAME"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose"
+                    <bean parent="shibboleth.Functions.Compose"
                         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
                 </entry>
diff --git a/idp-conf/src/main/resources/system/conf/subject-c14n-system.xml b/idp-conf/src/main/resources/system/conf/subject-c14n-system.xml
index f246f4f..020705a 100644
--- a/idp-conf/src/main/resources/system/conf/subject-c14n-system.xml
+++ b/idp-conf/src/main/resources/system/conf/subject-c14n-system.xml
@@ -69,7 +69,7 @@
     <bean id="c14n/SAML2Transform" parent="shibboleth.AbstractSAML2C14NFlowBean"
             p:formats-ref="shibboleth.NameTransformFormats">
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="and">
+            <bean parent="shibboleth.Conditions.AND">
                 <constructor-arg>
                     <list>
                         <bean class="net.shibboleth.idp.saml.nameid.impl.NameIDCanonicalization.ActivationCondition" />
@@ -83,7 +83,7 @@
     <bean id="c14n/SAML1Transform" parent="shibboleth.AbstractSAML1C14NFlowBean"
             p:formats-ref="shibboleth.NameTransformFormats"> 
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="and">
+            <bean parent="shibboleth.Conditions.AND">
                 <constructor-arg>
                     <list>
                         <bean class="net.shibboleth.idp.saml.nameid.impl.NameIdentifierCanonicalization.ActivationCondition" />
diff --git a/idp-conf/src/main/resources/system/conf/utilities.xml b/idp-conf/src/main/resources/system/conf/utilities.xml
index 9594f96..df590e4 100644
--- a/idp-conf/src/main/resources/system/conf/utilities.xml
+++ b/idp-conf/src/main/resources/system/conf/utilities.xml
@@ -26,11 +26,11 @@
         class="com.google.common.base.Predicates" factory-method="alwaysTrue" />
     
     <bean id="shibboleth.Conditions.AND"
-        class="com.google.common.base.Predicates" factory-method="and" abstract="true" />
+        class="net.shibboleth.utilities.java.support.logic.PredicateSupport" factory-method="and" abstract="true" />
     <bean id="shibboleth.Conditions.NOT"
-        class="com.google.common.base.Predicates" factory-method="not" abstract="true" />
+        class="net.shibboleth.utilities.java.support.logic.PredicateSupport" factory-method="not" abstract="true" />
     <bean id="shibboleth.Conditions.OR"
-        class="com.google.common.base.Predicates" factory-method="or" abstract="true" />
+        class="net.shibboleth.utilities.java.support.logic.PredicateSupport" factory-method="or" abstract="true" />
     
     <bean id="shibboleth.Conditions.BrowserProfile"
         class="org.opensaml.profile.logic.BrowserProfilePredicate" />
@@ -41,10 +41,16 @@
     <bean id="shibboleth.Conditions.Expression"
         class="net.shibboleth.idp.profile.logic.SpringExpressionPredicate" abstract="true" />
 
+    <bean id="shibboleth.Functions.Compose"
+        class="net.shibboleth.utilities.java.support.logic.FunctionSupport" factory-method="compose" abstract="true" />
+
+    <bean id="shibboleth.Functions.Constant"
+        class="net.shibboleth.utilities.java.support.logic.FunctionSupport" factory-method="constant" abstract="true" />
+
     <bean id="shibboleth.Functions.Scripted"
-        class="net.shibboleth.utilities.java.support.logic.ScriptedFunction"  abstract="true" />
+        class="net.shibboleth.utilities.java.support.logic.ScriptedFunction" abstract="true" />
     <bean id="shibboleth.Functions.Expression"
-        class="net.shibboleth.ext.spring.util.SpringExpressionFunction"  abstract="true" />
+        class="net.shibboleth.ext.spring.util.SpringExpressionFunction" abstract="true" />
     
     <!-- Parent bean for indirecting a lookup into a managed/reloadable bean. -->
     
@@ -65,11 +71,11 @@
     <bean id="shibboleth.Conditions.EntityDescriptor" abstract="true"
             class="net.shibboleth.utilities.java.support.logic.StrategyIndirectedPredicate">
         <constructor-arg name="objectStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
-                <constructor-arg>
+            <bean parent="shibboleth.Functions.Compose">
+                <constructor-arg name="g">
                     <bean class="org.opensaml.saml.common.messaging.context.navigate.EntityDescriptorLookupFunction" />
                 </constructor-arg>
-                <constructor-arg>
+                <constructor-arg name="f">
                     <bean class="net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLookupFunction" />
                 </constructor-arg>
             </bean>
@@ -80,7 +86,7 @@
     <bean id="shibboleth.Conditions.SubjectName" abstract="true"
             class="net.shibboleth.utilities.java.support.logic.StrategyIndirectedPredicate">
         <constructor-arg name="objectStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.PrincipalNameLookup.Subject"
                 c:f-ref="shibboleth.ChildLookup.SubjectContext" />
         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/admin/admin-abstract-beans.xml b/idp-conf/src/main/resources/system/flows/admin/admin-abstract-beans.xml
index 79b04bc..215bfd9 100644
--- a/idp-conf/src/main/resources/system/flows/admin/admin-abstract-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/admin-abstract-beans.xml
@@ -76,12 +76,12 @@
         c:expression="#input.getSubcontext(T(net.shibboleth.idp.profile.context.RelyingPartyContext)).getProfileConfig().getPolicyName()" />
 
     <!-- Default operation/resource suppliers for access checks. -->
-    <bean id="DefaultOperationLookupStrategy" class="com.google.common.base.Functions" factory-method="constant">
+    <bean id="DefaultOperationLookupStrategy" parent="shibboleth.Functions.Constant">
         <constructor-arg>
             <null/>
         </constructor-arg>
     </bean>
-    <bean id="DefaultResourceLookupStrategy" class="com.google.common.base.Functions" factory-method="constant">
+    <bean id="DefaultResourceLookupStrategy" parent="shibboleth.Functions.Constant">
         <constructor-arg>
             <null/>
         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/admin/mdquery-beans.xml b/idp-conf/src/main/resources/system/flows/admin/mdquery-beans.xml
index 183ee65..e97e3d5 100644
--- a/idp-conf/src/main/resources/system/flows/admin/mdquery-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/mdquery-beans.xml
@@ -23,8 +23,7 @@
 
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="read" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="read" />
         
     <bean id="shibboleth.AdminResourceLookupStrategy"
         class="net.shibboleth.idp.profile.context.navigate.SpringExpressionContextLookupFunction"
diff --git a/idp-conf/src/main/resources/system/flows/admin/metrics-beans.xml b/idp-conf/src/main/resources/system/flows/admin/metrics-beans.xml
index c7f1c13..9d1a08f 100644
--- a/idp-conf/src/main/resources/system/flows/admin/metrics-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/metrics-beans.xml
@@ -23,8 +23,7 @@
 
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="read" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="read" />
         
     <bean id="shibboleth.AdminResourceLookupStrategy" parent="shibboleth.ContextFunctions.Expression"
         c:outputType="#{T(java.lang.String)}"
diff --git a/idp-conf/src/main/resources/system/flows/admin/reload-metadata-beans.xml b/idp-conf/src/main/resources/system/flows/admin/reload-metadata-beans.xml
index 3c7dd4d..8eb94d6 100644
--- a/idp-conf/src/main/resources/system/flows/admin/reload-metadata-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/reload-metadata-beans.xml
@@ -23,8 +23,7 @@
 
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="reload" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="reload" />
         
     <bean id="shibboleth.AdminResourceLookupStrategy"
         class="net.shibboleth.idp.profile.context.navigate.SpringExpressionContextLookupFunction"
diff --git a/idp-conf/src/main/resources/system/flows/admin/reload-service-beans.xml b/idp-conf/src/main/resources/system/flows/admin/reload-service-beans.xml
index 8f2209d..e5696d6 100644
--- a/idp-conf/src/main/resources/system/flows/admin/reload-service-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/reload-service-beans.xml
@@ -23,8 +23,7 @@
 
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="reload" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="reload" />
         
     <bean id="shibboleth.AdminResourceLookupStrategy"
         class="net.shibboleth.idp.profile.context.navigate.SpringExpressionContextLookupFunction"
diff --git a/idp-conf/src/main/resources/system/flows/admin/resolvertest-beans.xml b/idp-conf/src/main/resources/system/flows/admin/resolvertest-beans.xml
index bddb992..15e8007 100644
--- a/idp-conf/src/main/resources/system/flows/admin/resolvertest-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/resolvertest-beans.xml
@@ -23,8 +23,7 @@
 
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="read" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="read" />
         
     <bean id="shibboleth.AdminResourceLookupStrategy"
         class="net.shibboleth.idp.profile.context.navigate.SpringExpressionContextLookupFunction"
@@ -48,9 +47,9 @@
                     <key>
                         <util:constant static-field="net.shibboleth.idp.saml.profile.SAMLAuditFields.PROTOCOL"/>
                     </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
-                            <bean class="com.google.common.base.Functions" factory-method="compose">
+                            <bean parent="shibboleth.Functions.Compose">
                                 <constructor-arg name="g">
                                     <bean class="org.opensaml.saml.common.messaging.context.navigate.SAMLProtocolContextProtocolFunction" />
                                 </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/admin/status-beans.xml b/idp-conf/src/main/resources/system/flows/admin/status-beans.xml
index 63c10ef..3428e17 100644
--- a/idp-conf/src/main/resources/system/flows/admin/status-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/status-beans.xml
@@ -22,11 +22,9 @@
     
     <!-- Default operation/resource suppliers for access checks. -->
     
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="read" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="read" />
         
-    <bean id="shibboleth.AdminResourceLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="status" />
+    <bean id="shibboleth.AdminResourceLookupStrategy" parent="shibboleth.Functions.Constant" c:target="status" />
     
     <util:list id="ServiceCollection">
         <ref bean="shibboleth.LoggingService" />
diff --git a/idp-conf/src/main/resources/system/flows/admin/unlock-keys-beans.xml b/idp-conf/src/main/resources/system/flows/admin/unlock-keys-beans.xml
index 481736d..f769376 100644
--- a/idp-conf/src/main/resources/system/flows/admin/unlock-keys-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/admin/unlock-keys-beans.xml
@@ -22,11 +22,9 @@
     
     <!-- Default operation/resource suppliers for access checks. -->
 
-    <bean id="shibboleth.AdminOperationLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="unlock" />
+    <bean id="shibboleth.AdminOperationLookupStrategy" parent="shibboleth.Functions.Constant" c:target="unlock" />
         
-    <bean id="shibboleth.AdminResourceLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="keys" />
+    <bean id="shibboleth.AdminResourceLookupStrategy" parent="shibboleth.Functions.Constant" c:target="keys" />
     
     <!--  Work beans. -->
         
diff --git a/idp-conf/src/main/resources/system/flows/authn/authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/authn-beans.xml
index dfc0658..d4b676d 100644
--- a/idp-conf/src/main/resources/system/flows/authn/authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/authn-beans.xml
@@ -64,12 +64,12 @@
             <bean parent="shibboleth.CommaDelimStringArray" c:_0="#{ '%{idp.authn.resolveAttribute:null}'.trim() }" />
         </property>
         <property name="principalNameLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.PrincipalNameLookup.Session"
                 c:f-ref="shibboleth.ChildLookup.SessionContext" />
         </property>
         <property name="attributeContextCreationStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookupOrCreate.AttributeContext"
                 c:f-ref="shibboleth.ChildLookup.AuthenticationContext" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/authn/duo-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/duo-authn-beans.xml
index 6d354fb..c060fb6 100644
--- a/idp-conf/src/main/resources/system/flows/authn/duo-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/duo-authn-beans.xml
@@ -21,16 +21,16 @@
         p:applicationKey="%{idp.duo.applicationKey:none}"
         p:integrationKey="%{idp.duo.integrationKey:none}"
         p:secretKey="%{idp.duo.secretKey:none}" />
-    <bean id="shibboleth.authn.Duo.DuoIntegrationStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0-ref="shibboleth.authn.Duo.DuoIntegration" />
+    <bean id="shibboleth.authn.Duo.DuoIntegrationStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.Duo.DuoIntegration" />
 
     <bean id="shibboleth.authn.Duo.NonBrowser.DuoIntegration" class="net.shibboleth.idp.authn.duo.BasicDuoIntegration"
         p:APIHost="%{idp.duo.nonbrowser.apiHost:%{idp.duo.apiHost:none}}"
         p:applicationKey="%{idp.duo.nonbrowser.applicationKey:none}"
         p:integrationKey="%{idp.duo.nonbrowser.integrationKey:none}"
         p:secretKey="%{idp.duo.nonbrowser.secretKey:none}" />
-    <bean id="shibboleth.authn.Duo.NonBrowser.DuoIntegrationStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0-ref="shibboleth.authn.Duo.NonBrowser.DuoIntegration" />
+    <bean id="shibboleth.authn.Duo.NonBrowser.DuoIntegrationStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.Duo.NonBrowser.DuoIntegration" />
 
 
     <!-- Default username comes from previous c14n or session. -->        
diff --git a/idp-conf/src/main/resources/system/flows/authn/external-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/external-authn-beans.xml
index 5a837e8..cfbd1ce 100644
--- a/idp-conf/src/main/resources/system/flows/authn/external-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/external-authn-beans.xml
@@ -19,9 +19,8 @@
     <bean class="net.shibboleth.idp.profile.impl.ProfileActionBeanPostProcessor" />
 
     <!-- Default strategy function to obtain the external path. -->
-    <bean id="shibboleth.authn.External.externalAuthnPathStrategy"
-        class="com.google.common.base.Functions" factory-method="constant"
-        c:_0-ref="shibboleth.authn.External.externalAuthnPath" />
+    <bean id="shibboleth.authn.External.externalAuthnPathStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.External.externalAuthnPath" />
 
     <import resource="../../../conf/authn/external-authn-config.xml" />
 
diff --git a/idp-conf/src/main/resources/system/flows/authn/mfa-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/mfa-authn-beans.xml
index f7e06fc..e31322e 100644
--- a/idp-conf/src/main/resources/system/flows/authn/mfa-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/mfa-authn-beans.xml
@@ -21,8 +21,8 @@
     <!-- Default empty map. -->
     <util:map id="shibboleth.authn.MFA.TransitionMap" />
 
-    <bean id="shibboleth.authn.MFA.TransitionMapStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0-ref="shibboleth.authn.MFA.TransitionMap" />
+    <bean id="shibboleth.authn.MFA.TransitionMapStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.MFA.TransitionMap" />
 
     <import resource="../../../conf/authn/mfa-authn-config.xml" />
 
diff --git a/idp-conf/src/main/resources/system/flows/authn/remoteuser-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/remoteuser-authn-beans.xml
index 0d14c6d..89a7a2b 100644
--- a/idp-conf/src/main/resources/system/flows/authn/remoteuser-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/remoteuser-authn-beans.xml
@@ -19,9 +19,8 @@
     <bean class="net.shibboleth.idp.profile.impl.ProfileActionBeanPostProcessor" />
 
     <!-- Default strategy function to obtain the external path. -->
-    <bean id="shibboleth.authn.RemoteUser.externalAuthnPathStrategy"
-        class="com.google.common.base.Functions" factory-method="constant"
-        c:_0-ref="shibboleth.authn.RemoteUser.externalAuthnPath" />
+    <bean id="shibboleth.authn.RemoteUser.externalAuthnPathStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.RemoteUser.externalAuthnPath" />
     
     <import resource="../../../conf/authn/remoteuser-authn-config.xml" />
 
diff --git a/idp-conf/src/main/resources/system/flows/authn/spnego-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/spnego-authn-beans.xml
index 8fa2f71..d742d99 100644
--- a/idp-conf/src/main/resources/system/flows/authn/spnego-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/spnego-authn-beans.xml
@@ -25,9 +25,8 @@
         c:_0="servletRelative:%{idp.authn.spnego.externalAuthnPath:/Authn/SPNEGO}" />
 
     <!-- Default strategy function to obtain the external path. -->
-    <bean id="shibboleth.authn.SPNEGO.externalAuthnPathStrategy"
-        class="com.google.common.base.Functions" factory-method="constant"
-        c:_0-ref="shibboleth.authn.SPNEGO.externalAuthnPath" />
+    <bean id="shibboleth.authn.SPNEGO.externalAuthnPathStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.SPNEGO.externalAuthnPath" />
 
     <import resource="../../../conf/authn/spnego-authn-config.xml" />
 
diff --git a/idp-conf/src/main/resources/system/flows/authn/x509-authn-beans.xml b/idp-conf/src/main/resources/system/flows/authn/x509-authn-beans.xml
index 0349d23..5995612 100644
--- a/idp-conf/src/main/resources/system/flows/authn/x509-authn-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/authn/x509-authn-beans.xml
@@ -19,9 +19,8 @@
     <bean class="net.shibboleth.idp.profile.impl.ProfileActionBeanPostProcessor" />
 
     <!-- Default strategy function to obtain the external path. -->
-    <bean id="shibboleth.authn.X509.externalAuthnPathStrategy"
-        class="com.google.common.base.Functions" factory-method="constant"
-        c:_0-ref="shibboleth.authn.X509.externalAuthnPath" />
+    <bean id="shibboleth.authn.X509.externalAuthnPathStrategy" parent="shibboleth.Functions.Constant"
+        c:target-ref="shibboleth.authn.X509.externalAuthnPath" />
 
     <import resource="../../../conf/authn/x509-authn-config.xml" />
 
diff --git a/idp-conf/src/main/resources/system/flows/c14n/attribute-sourced-subject-c14n-beans.xml b/idp-conf/src/main/resources/system/flows/c14n/attribute-sourced-subject-c14n-beans.xml
index d3211ce..7576996 100644
--- a/idp-conf/src/main/resources/system/flows/c14n/attribute-sourced-subject-c14n-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/c14n/attribute-sourced-subject-c14n-beans.xml
@@ -26,7 +26,7 @@
             p:maskFailures="%{idp.service.attribute.resolver.maskFailures:true}"
             p:principalNameLookupStrategy="#{getObject('shibboleth.c14n.attribute.PrincipalNameLookupStrategy')}">
         <property name="attributeContextCreationStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookupOrCreate.AttributeContext"
                 c:f-ref="shibboleth.ChildLookup.SubjectCanonicalizationContext" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/cas/login/login-beans.xml b/idp-conf/src/main/resources/system/flows/cas/login/login-beans.xml
index a87c776..e778061 100644
--- a/idp-conf/src/main/resources/system/flows/cas/login/login-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/cas/login/login-beans.xml
@@ -71,12 +71,10 @@
           class="org.opensaml.messaging.context.navigate.ChildContextLookup"
           c:type="net.shibboleth.idp.session.context.SessionContext" />
 
-    <bean id="PrincipalLookupFunction"
-          class="com.google.common.base.Functions"
-          factory-method="compose">
-        <constructor-arg index="0">
+    <bean id="PrincipalLookupFunction" parent="shibboleth.Functions.Compose">
+        <constructor-arg name="g">
             <bean class="net.shibboleth.idp.session.context.navigate.SessionContextPrincipalLookupFunction" />
         </constructor-arg>
-        <constructor-arg index="1" ref="SessionContextLookup" />
+        <constructor-arg name="f" ref="SessionContextLookup" />
     </bean>
 </beans>
\ No newline at end of file
diff --git a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-beans.xml b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-beans.xml
index e55b1ae..6da8574 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-beans.xml
@@ -39,8 +39,7 @@
 
     <!-- Functions to return a storage key consisting of the user identifier. -->
 
-    <bean id="shibboleth.consent.PrincipalConsentStorageKey"
-        class="com.google.common.base.Functions" factory-method="compose"
+    <bean id="shibboleth.consent.PrincipalConsentStorageKey" parent="shibboleth.Functions.Compose"
         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
         
@@ -68,7 +67,7 @@
         class="net.shibboleth.idp.consent.logic.impl.JoinFunction"
         c:functionA-ref="shibboleth.consent.UserStorageKey">
         <constructor-arg name="functionB">
-            <bean class="com.google.common.base.Functions" factory-method="constant">
+            <bean parent="shibboleth.Functions.Constant">
                 <constructor-arg>
                     <util:constant
                         static-field="net.shibboleth.idp.consent.flow.storage.impl.AbstractConsentIndexedStorageAction.DEFAULT_STORAGE_INDEX_KEY" />
diff --git a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-flow.xml b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-flow.xml
index 712a502..a82a988 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-flow.xml
@@ -94,7 +94,7 @@
     <!-- If global consent has been given by user, skip the rest of the flow. -->
     
     <decision-state id="TestForGlobalAttributeConsent">
-        <if test="GlobalAttributeConsentPredicate.apply(opensamlProfileRequestContext)"
+        <if test="GlobalAttributeConsentPredicate.test(opensamlProfileRequestContext)"
             then="proceed" else="PopulateConsentContext" />
     </decision-state>
 
@@ -111,7 +111,7 @@
     <!-- If consent is required, display page. Otherwise, release attributes.  -->
     
     <decision-state id="IsConsentRequired">
-        <if test="IsConsentRequiredPredicate.apply(opensamlProfileRequestContext)"
+        <if test="IsConsentRequiredPredicate.test(opensamlProfileRequestContext)"
             then="DisplayAttributeReleasePage" else="ReleaseAttributes" />
     </decision-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-beans.xml b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-beans.xml
index db6aaa4..d21829e 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-beans.xml
@@ -16,8 +16,8 @@
 
     <!-- Use 'intercept/attribute-release' as storage context. -->
 
-    <bean id="AttributeReleaseStorageContextLookupStrategy" class="com.google.common.base.Functions"
-        factory-method="constant" c:_0="intercept/attribute-release" />
+    <bean id="AttributeReleaseStorageContextLookupStrategy" parent="shibboleth.Functions.Constant"
+        c:target="intercept/attribute-release" />
 
     <bean id="ReadAttributeReleaseConsentFromStorage"
         class="net.shibboleth.idp.consent.flow.storage.impl.ReadConsentFromStorage" scope="prototype"
diff --git a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-flow.xml b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-flow.xml
index a1cefbb..2c6be97 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/attribute-release-query-flow.xml
@@ -48,7 +48,7 @@
     <!-- If global consent has been given by user, skip the rest of the flow. -->
     
     <decision-state id="TestForGlobalAttributeConsent">
-        <if test="GlobalAttributeConsentPredicate.apply(opensamlProfileRequestContext)"
+        <if test="GlobalAttributeConsentPredicate.test(opensamlProfileRequestContext)"
             then="proceed" else="CheckPreviousConsents" />
     </decision-state>
     
diff --git a/idp-conf/src/main/resources/system/flows/intercept/context-check-flow.xml b/idp-conf/src/main/resources/system/flows/intercept/context-check-flow.xml
index fc90c37..ed40724 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/context-check-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/context-check-flow.xml
@@ -22,7 +22,7 @@
     </action-state>
     
     <decision-state id="CheckCondition">
-        <if test="flowRequestContext.getActiveFlow().getApplicationContext().getBean('shibboleth.context-check.Condition').apply(opensamlProfileRequestContext)"
+        <if test="flowRequestContext.getActiveFlow().getApplicationContext().getBean('shibboleth.context-check.Condition').test(opensamlProfileRequestContext)"
             then="proceed" else="ContextCheckDenied" />
     </decision-state>
     
diff --git a/idp-conf/src/main/resources/system/flows/intercept/expiring-password-flow.xml b/idp-conf/src/main/resources/system/flows/intercept/expiring-password-flow.xml
index 360cfb8..1fa5026 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/expiring-password-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/expiring-password-flow.xml
@@ -8,7 +8,7 @@
 
     <!-- If the condition is true, we don't need to notify, otherwise check cookie to see if we do. -->
     <decision-state id="CheckContext">
-        <if test="ExpiringPasswordPredicate.apply(opensamlProfileRequestContext)"
+        <if test="ExpiringPasswordPredicate.test(opensamlProfileRequestContext)"
             then="ShouldUnsetCookie" else="CheckCookie" />
     </decision-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/intercept/impersonate-beans.xml b/idp-conf/src/main/resources/system/flows/intercept/impersonate-beans.xml
index 7328135..85b0632 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/impersonate-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/impersonate-beans.xml
@@ -58,7 +58,7 @@
 		            <key>
 		                <util:constant static-field="net.shibboleth.idp.profile.IdPAuditFields.IMPERSONATING_USERNAME"/>
 		            </key>
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose"
                         <constructor-arg name="g">
                             <bean class="net.shibboleth.idp.authn.context.navigate.SubjectContextImpersonatingPrincipalLookupFunction" />
                         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-beans.xml b/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-beans.xml
index aedaa38..868ece4 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-beans.xml
@@ -27,8 +27,7 @@
 
     <!-- Functions to return part of the storage key consisting of the user identifier. -->
     
-    <bean id="shibboleth.consent.PrincipalConsentStorageKey"
-        class="com.google.common.base.Functions" factory-method="compose"
+    <bean id="shibboleth.consent.PrincipalConsentStorageKey" parent="shibboleth.Functions.Compose"
         c:g-ref="shibboleth.PrincipalNameLookup.Subject"
         c:f-ref="shibboleth.ChildLookup.SubjectContext" />
         
@@ -56,7 +55,7 @@
         class="net.shibboleth.idp.consent.logic.impl.JoinFunction"
         c:functionA-ref="shibboleth.consent.UserStorageKey">
         <constructor-arg name="functionB">
-            <bean class="com.google.common.base.Functions" factory-method="constant">
+            <bean parent="shibboleth.Functions.Constant">
                 <constructor-arg>
                     <util:constant
                         static-field="net.shibboleth.idp.consent.flow.storage.impl.AbstractConsentIndexedStorageAction.DEFAULT_STORAGE_INDEX_KEY" />
diff --git a/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-flow.xml b/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-flow.xml
index 4ab4f43..cdd3064 100644
--- a/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/intercept/terms-of-use-flow.xml
@@ -24,7 +24,7 @@
     </decision-state>
 
    <decision-state id="IsConsentRequired">
-        <if test="IsConsentRequiredPredicate.apply(opensamlProfileRequestContext)" then="DisplayTermsOfUsePage" else="proceed" />
+        <if test="IsConsentRequiredPredicate.test(opensamlProfileRequestContext)" then="DisplayTermsOfUsePage" else="proceed" />
     </decision-state>
 
     <view-state id="DisplayTermsOfUsePage" view="#{flowRequestContext.activeFlow.id}">
diff --git a/idp-conf/src/main/resources/system/flows/logout/logout-beans.xml b/idp-conf/src/main/resources/system/flows/logout/logout-beans.xml
index 0ff764b..b8a0840 100644
--- a/idp-conf/src/main/resources/system/flows/logout/logout-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/logout/logout-beans.xml
@@ -72,9 +72,9 @@
             <bean parent="shibboleth.CommaDelimStringArray" c:_0="#{'%{idp.ui.fallbackLanguages:}'.trim()}" />
         </property>
         <property name="metadataContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <ref bean="shibboleth.ChildLookup.SAMLMetadataContext" />
                         </constructor-arg>
@@ -89,9 +89,9 @@
             </bean>
         </property>
         <property name="RPUIContextCreateStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <ref bean="shibboleth.ChildLookupOrCreate.RelyingPartyUIContext" />
                         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/logout/logout-flow.xml b/idp-conf/src/main/resources/system/flows/logout/logout-flow.xml
index a4ec03a..8b5122d 100644
--- a/idp-conf/src/main/resources/system/flows/logout/logout-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/logout/logout-flow.xml
@@ -33,7 +33,7 @@
         
         <transition on="proceed" to="CheckPromptCondition1">
             <set name="flowScope.transitionAfterDestroy" value="'ContinueLogout'" />
-            <set name="flowScope.promptForIdP" value="UserPromptCondition.apply(opensamlProfileRequestContext)" />
+            <set name="flowScope.promptForIdP" value="UserPromptCondition.test(opensamlProfileRequestContext)" />
         </transition>
     </action-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/logout/propagation/saml2-beans.xml b/idp-conf/src/main/resources/system/flows/logout/propagation/saml2-beans.xml
index 192691b..11f5684 100644
--- a/idp-conf/src/main/resources/system/flows/logout/propagation/saml2-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/logout/propagation/saml2-beans.xml
@@ -71,7 +71,7 @@
             class="org.opensaml.saml.saml2.profile.impl.EncryptNameIDs" scope="prototype"
             p:recipientLookupStrategy-ref="shibboleth.RelyingPartyIdLookup.Simple">
         <property name="encryptionContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.EncryptionParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml-abstract-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml-abstract-beans.xml
index 5a2d3b8..9c8ea49 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml-abstract-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml-abstract-beans.xml
@@ -167,12 +167,12 @@
             </bean>
         </property>
         <property name="securityParametersContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookupOrCreate.SecurityParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
         <property name="existingParametersContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.SecurityParameters"
                 c:f-ref="shibboleth.MessageContextLookup.Outbound" />
         </property>
@@ -284,7 +284,7 @@
 
     <bean id="SignAssertions" class="org.opensaml.saml.common.profile.impl.SignAssertions" scope="prototype">
         <property name="securityParametersLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.SecurityParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml1/attribute-query-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml1/attribute-query-beans.xml
index 1ec5849..4cf0537 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml1/attribute-query-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml1/attribute-query-beans.xml
@@ -78,7 +78,7 @@
             </bean>
         </property>
         <property name="activeFlowsLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="constant" c:_0="#{ {'attribute-release-query' } }" />
+            <bean parent="shibboleth.Functions.Constant" c:target="#{ {'attribute-release-query' } }" />
         </property>
     </bean>
 
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml1/sso-abstract-flow.xml b/idp-conf/src/main/resources/system/flows/saml/saml1/sso-abstract-flow.xml
index 3769480..38b4471 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml1/sso-abstract-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml1/sso-abstract-flow.xml
@@ -43,7 +43,7 @@
     </subflow-state>
     
     <decision-state id="ResolveAttributes">
-        <if test="ResolveAttributesPredicate.apply(opensamlProfileRequestContext)"
+        <if test="ResolveAttributesPredicate.test(opensamlProfileRequestContext)"
             then="AttributeResolution"
             else="BuildResponse" />
     </decision-state>
@@ -118,7 +118,7 @@
             <evaluate expression="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.profile.context.SpringRequestContext), true).setRequestContext(flowRequestContext)" />
             <evaluate expression="LogEvent" />
         </on-entry>
-        <if test="LocalErrorPredicate.apply(opensamlProfileRequestContext)"
+        <if test="LocalErrorPredicate.test(opensamlProfileRequestContext)"
             then="HandleErrorWithView" else="HandleErrorWithResponse" />
     </decision-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/attribute-query-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/attribute-query-beans.xml
index 95779b9..9fe154e 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/attribute-query-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/attribute-query-beans.xml
@@ -83,7 +83,7 @@
             </bean>
         </property>
         <property name="activeFlowsLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="constant" c:_0="#{ {'attribute-release-query' } }" />
+            <bean parent="shibboleth.Functions.Constant" c:target="#{ {'attribute-release-query' } }" />
         </property>
     </bean>
 
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/common-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/common-beans.xml
index 5119d23..2272ff0 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/common-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/common-beans.xml
@@ -114,7 +114,7 @@
             p:encryptToSelfParametersStrategy-ref="EncryptToSelfParametersStrategy"
             p:selfRecipientLookupStrategy-ref="shibboleth.ResponderIdLookup.Simple" >
         <property name="encryptionContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.EncryptionParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
@@ -124,7 +124,7 @@
             class="org.opensaml.saml.saml2.profile.impl.EncryptAttributes" scope="prototype"
             p:recipientLookupStrategy-ref="shibboleth.RelyingPartyIdLookup.Simple">
         <property name="encryptionContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.EncryptionParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
@@ -134,7 +134,7 @@
             class="org.opensaml.saml.saml2.profile.impl.EncryptAssertions" scope="prototype"
             p:recipientLookupStrategy-ref="shibboleth.RelyingPartyIdLookup.Simple">
         <property name="encryptionContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.EncryptionParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-beans.xml
index 3bc20a8..dbb1939 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-beans.xml
@@ -80,7 +80,7 @@
             <bean class="net.shibboleth.idp.saml.saml2.profile.delegation.messaging.impl.ProcessFrameworkHandler" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
@@ -95,7 +95,7 @@
             <bean class="net.shibboleth.idp.saml.saml2.profile.delegation.messaging.impl.ProcessSenderHandler" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
@@ -110,7 +110,7 @@
             <bean class="org.opensaml.soap.wsaddressing.messaging.impl.ExtractMessageIDHandler" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
@@ -129,7 +129,7 @@
             </bean>
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-security-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-security-beans.xml
index b2cacfe..db8bc37 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-security-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/idwsf-ssos-security-beans.xml
@@ -26,7 +26,7 @@
                     p:entityContextClass="org.opensaml.saml.common.messaging.context.SAMLPresenterEntityContext" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
@@ -98,7 +98,7 @@
                     p:assertionValidator-ref="shibboleth.Delegation.SAML2AssertionTokenValidator" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-back-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-back-beans.xml
index 8fbab6b..c777a01 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-back-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-back-beans.xml
@@ -64,7 +64,7 @@
     <bean id="PopulateLogoutPropagationContext"
             class="net.shibboleth.idp.session.impl.PopulateLogoutPropagationContext" scope="prototype">
         <property name="sessionLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:f-ref="shibboleth.ChildLookup.LogoutContext">
                 <constructor-arg name="g">
                     <bean class="net.shibboleth.idp.session.context.navigate.LogoutContextSessionLookupFunction" />
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-beans.xml
index fd65165..f9f2871 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-beans.xml
@@ -55,7 +55,7 @@
             <bean parent="shibboleth.CommaDelimStringArray" c:_0="#{'%{idp.ui.fallbackLanguages:}'.trim()}" />
         </property>
         <property name="RPUIContextCreateStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
                     <ref bean="shibboleth.ChildLookupOrCreate.RelyingPartyUIContext" />
                 </constructor-arg>
@@ -80,9 +80,9 @@
             <bean parent="shibboleth.CommaDelimStringArray" c:_0="#{'%{idp.ui.fallbackLanguages:}'.trim()}" />
         </property>
         <property name="metadataContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <ref bean="shibboleth.ChildLookup.SAMLMetadataContext" />
                         </constructor-arg>
@@ -97,9 +97,9 @@
             </bean>
         </property>
         <property name="RPUIContextCreateStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose">
+            <bean parent="shibboleth.Functions.Compose">
                 <constructor-arg name="g">
-                    <bean class="com.google.common.base.Functions" factory-method="compose">
+                    <bean parent="shibboleth.Functions.Compose">
                         <constructor-arg name="g">
                             <ref bean="shibboleth.ChildLookupOrCreate.RelyingPartyUIContext" />
                         </constructor-arg>
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-flow.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-flow.xml
index 791c20c..f06f516 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/slo-front-abstract-flow.xml
@@ -69,7 +69,7 @@
         
         <transition on="proceed" to="CheckPromptCondition1">
             <set name="flowScope.transitionAfterDestroy" value="'ContinueLogout'" />
-            <set name="flowScope.promptForIdP" value="UserPromptCondition.apply(opensamlProfileRequestContext)" />
+            <set name="flowScope.promptForIdP" value="UserPromptCondition.test(opensamlProfileRequestContext)" />
         </transition>
     </action-state>
 
@@ -111,7 +111,7 @@
     </action-state>
 
     <decision-state id="NextRelyingPartyContext">
-        <if test="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.profile.context.MultiRelyingPartyContext), true).getRelyingPartyContextIterator().hasNext()"
+        <if test="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.profile.context.MultiRelyingPartyContext),true).getRelyingPartyContextIterator().hasNext()"
             then="SetRPUIInformation" else="LogoutView" />
     </decision-state>
     
@@ -209,7 +209,7 @@
             <evaluate expression="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.profile.context.SpringRequestContext), true).setRequestContext(flowRequestContext)" />
             <evaluate expression="LogEvent" />
         </on-entry>
-        <if test="LocalErrorPredicate.apply(opensamlProfileRequestContext)"
+        <if test="LocalErrorPredicate.test(opensamlProfileRequestContext)"
             then="HandleErrorWithView" else="HandleErrorWithResponse" />
     </decision-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-beans.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-beans.xml
index 047856f..a57b3f5 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-beans.xml
@@ -36,7 +36,7 @@
             </bean>
         </property>
         <property name="encryptionContextLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="compose"
+            <bean parent="shibboleth.Functions.Compose"
                 c:g-ref="shibboleth.ChildLookup.EncryptionParameters"
                 c:f-ref="shibboleth.ChildLookup.RelyingParty" />
         </property>
diff --git a/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-flow.xml b/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-flow.xml
index cfe78d5..b0aa91a 100644
--- a/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-flow.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/saml2/sso-abstract-flow.xml
@@ -49,7 +49,7 @@
     </subflow-state>
     
     <decision-state id="ResolveAttributes">
-        <if test="ResolveAttributesPredicate.apply(opensamlProfileRequestContext)"
+        <if test="ResolveAttributesPredicate.test(opensamlProfileRequestContext)"
             then="AttributeResolution"
             else="BuildResponse" />
     </decision-state>
@@ -144,14 +144,14 @@
             <evaluate expression="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.profile.context.SpringRequestContext), true).setRequestContext(flowRequestContext)" />
             <evaluate expression="LogEvent" />
         </on-entry>
-        <if test="LocalErrorPredicate.apply(opensamlProfileRequestContext)"
+        <if test="LocalErrorPredicate.test(opensamlProfileRequestContext)"
             then="HandleErrorLocally" else="HandleErrorWithResponse" />
     </decision-state>
 
     <!-- For ECP, local errors mean SOAP faults. -->
     
     <decision-state id="HandleErrorLocally">
-        <if test="opensamlProfileRequestContext.isBrowserProfile() or !SOAPErrorPredicate.apply(opensamlProfileRequestContext)"
+        <if test="opensamlProfileRequestContext.isBrowserProfile() or !SOAPErrorPredicate.test(opensamlProfileRequestContext)"
             then="HandleErrorWithView" else="SOAPFault" />
     </decision-state>
 
diff --git a/idp-conf/src/main/resources/system/flows/saml/security-beans.xml b/idp-conf/src/main/resources/system/flows/saml/security-beans.xml
index 6ff9b12..cb39b8d 100644
--- a/idp-conf/src/main/resources/system/flows/saml/security-beans.xml
+++ b/idp-conf/src/main/resources/system/flows/saml/security-beans.xml
@@ -107,7 +107,7 @@
                     p:httpServletRequest-ref="shibboleth.HttpServletRequest" />
         </constructor-arg>
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="not"
+            <bean parent="shibboleth.Conditions.NOT"
                 c:predicate-ref="shibboleth.Conditions.BrowserProfile" />
         </property>
         <property name="errorEvent">
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ToggleablePredicate.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ToggleablePredicate.java
index 42a1827..b2e359b 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ToggleablePredicate.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/ToggleablePredicate.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.test.flows.cas;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nullable;
 
-import com.google.common.base.Predicate;
 import org.opensaml.profile.context.ProfileRequestContext;
 
 /**
@@ -34,8 +35,7 @@ public class ToggleablePredicate implements Predicate<ProfileRequestContext> {
         result = value;
     }
 
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext profileRequestContext) {
+    public boolean test(@Nullable final ProfileRequestContext profileRequestContext) {
         return result;
     }
 }
diff --git a/idp-conf/src/test/resources/intercept/flows/test-intercept-beans.xml b/idp-conf/src/test/resources/intercept/flows/test-intercept-beans.xml
index 7bd82d1..1e2459e 100644
--- a/idp-conf/src/test/resources/intercept/flows/test-intercept-beans.xml
+++ b/idp-conf/src/test/resources/intercept/flows/test-intercept-beans.xml
@@ -18,7 +18,7 @@
             class="net.shibboleth.idp.profile.interceptor.impl.PopulateProfileInterceptorContext" scope="prototype"
             p:availableFlows-ref="shibboleth.AvailableInterceptFlows">
         <property name="activeFlowsLookupStrategy">
-            <bean class="com.google.common.base.Functions" factory-method="constant" c:_0-ref="ActivatedFlows" />
+            <bean class="net.shibboleth.utilities.java.support.logic.FunctionSupport" factory-method="constant" c:_0-ref="ActivatedFlows" />
         </property>
     </bean>
 
diff --git a/idp-conf/src/test/resources/test/override-beans.xml b/idp-conf/src/test/resources/test/override-beans.xml
index d61e407..2d5997b 100644
--- a/idp-conf/src/test/resources/test/override-beans.xml
+++ b/idp-conf/src/test/resources/test/override-beans.xml
@@ -14,7 +14,7 @@
     <bean id="c14n/SAML2Transform" parent="shibboleth.AbstractSAML2C14NFlowBean"
             p:formats-ref="shibboleth.NameTransformFormats">
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="and">
+            <bean class="net.shibboleth.utilities.java.support.logic.PredicateSupport" factory-method="and">
                 <constructor-arg>
                     <list>
                         <bean class="net.shibboleth.idp.saml.nameid.impl.NameIDCanonicalization.ActivationCondition" />
@@ -28,7 +28,7 @@
     <bean id="c14n/SAML1Transform" parent="shibboleth.AbstractSAML1C14NFlowBean"
             p:formats-ref="shibboleth.NameTransformFormats"> 
         <property name="activationCondition">
-            <bean class="com.google.common.base.Predicates" factory-method="and">
+            <bean class="net.shibboleth.utilities.java.support.logic.PredicateSupport" factory-method="and">
                 <constructor-arg>
                     <list>
                         <bean class="net.shibboleth.idp.saml.nameid.impl.NameIdentifierCanonicalization.ActivationCondition" />
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 eb6084e..949f309 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.consent.audit.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,8 +30,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * {@link Function} that returns the current consent IDs from a {@link ConsentContext}.
  */
@@ -41,7 +40,7 @@ public class CurrentConsentIdsAuditExtractor implements Function<ProfileRequestC
 
     /** Constructor. */
     public CurrentConsentIdsAuditExtractor() {
-        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class, false);
+        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
     }
 
     /**
@@ -64,4 +63,4 @@ public class CurrentConsentIdsAuditExtractor implements Function<ProfileRequestC
         }
     }
 
-}
+}
\ 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 9e22e18..d565895 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.consent.audit.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -30,7 +31,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 
 /**
@@ -39,11 +39,11 @@ import com.google.common.collect.Collections2;
 public class CurrentConsentIsApprovedAuditExtractor implements Function<ProfileRequestContext, Collection<Boolean>> {
 
     /** Strategy used to find the {@link ConsentContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, ConsentContext> consentContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ConsentContext> consentContextLookupStrategy;
 
     /** Constructor. */
     public CurrentConsentIsApprovedAuditExtractor() {
-        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class, false);
+        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
     }
 
     /**
@@ -53,23 +53,19 @@ public class CurrentConsentIsApprovedAuditExtractor implements Function<ProfileR
      * @param strategy the consent context lookup strategy
      */
     public CurrentConsentIsApprovedAuditExtractor(
-            @Nonnull final Function<ProfileRequestContext, ConsentContext> strategy) {
+            @Nonnull final Function<ProfileRequestContext,ConsentContext> strategy) {
         consentContextLookupStrategy = Constraint.isNotNull(strategy, "Consent context lookup strategy cannot be null");
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public Collection<Boolean> apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public Collection<Boolean> apply(@Nullable final ProfileRequestContext input) {
+        
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null && !consentContext.getCurrentConsents().isEmpty()) {
-            return Collections2.transform(consentContext.getCurrentConsents().values(),
-                    new Function<Consent, Boolean>() {
-                        public Boolean apply(final Consent input) {
-                            return input.isApproved();
-                        }
-                    });
+            return Collections2.transform(consentContext.getCurrentConsents().values(), Consent::isApproved);
         } else {
             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 d3c8df7..fd7eab9 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.consent.audit.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -30,20 +31,19 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 
 /**
  * {@link Function} that returns the current consent values from an {@link ConsentContext}.
  */
-public class CurrentConsentValuesAuditExtractor implements Function<ProfileRequestContext, Collection<String>> {
+public class CurrentConsentValuesAuditExtractor implements Function<ProfileRequestContext,Collection<String>> {
 
     /** Strategy used to find the {@link ConsentContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, ConsentContext> consentContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ConsentContext> consentContextLookupStrategy;
 
     /** Constructor. */
     public CurrentConsentValuesAuditExtractor() {
-        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class, false);
+        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
     }
 
     /**
@@ -52,23 +52,19 @@ public class CurrentConsentValuesAuditExtractor implements Function<ProfileReque
      *
      * @param strategy the consent context lookup strategy
      */
-    public CurrentConsentValuesAuditExtractor(@Nonnull final Function<ProfileRequestContext, ConsentContext> strategy) {
+    public CurrentConsentValuesAuditExtractor(@Nonnull final Function<ProfileRequestContext,ConsentContext> strategy) {
         consentContextLookupStrategy = Constraint.isNotNull(strategy, "Consent context lookup strategy cannot be null");
     }
 
     /** {@inheritDoc} */
     @Override @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
+        
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null && !consentContext.getCurrentConsents().isEmpty()) {
-            return Collections2.transform(consentContext.getCurrentConsents().values(),
-                    new Function<Consent, String>() {
-                        public String apply(final Consent input) {
-                            return input.getValue();
-                        }
-                    });
+            return Collections2.transform(consentContext.getCurrentConsents().values(), Consent::getValue);
         } else {
             return Collections.emptyList();
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
index 02f25ae..89ef23b 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseAction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.consent.flow.ar.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -35,9 +37,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Base class for attribute release consent actions.
  * 
@@ -63,7 +62,7 @@ public abstract class AbstractAttributeReleaseAction extends AbstractConsentActi
     @Nullable private AttributeReleaseContext attributeReleaseContext;
 
     /** Strategy used to find the {@link AttributeReleaseContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, AttributeReleaseContext> attributeReleaseContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,AttributeReleaseContext> attributeReleaseContextLookupStrategy;
 
     /** The attribute consent flow descriptor. */
     @Nullable private AttributeReleaseFlowDescriptor attributeReleaseFlowDescriptor;
@@ -72,15 +71,15 @@ public abstract class AbstractAttributeReleaseAction extends AbstractConsentActi
     @Nullable private AttributeContext attributeContext;
 
     /** Strategy used to find the {@link AttributeContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, AttributeContext> attributeContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,AttributeContext> attributeContextLookupStrategy;
 
     /** Constructor. */
     public AbstractAttributeReleaseAction() {
-        attributeReleaseContextLookupStrategy = new ChildContextLookup<>(AttributeReleaseContext.class, false);
+        attributeReleaseContextLookupStrategy = new ChildContextLookup<>(AttributeReleaseContext.class);
 
         attributeContextLookupStrategy =
-                Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                        new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(RelyingPartyContext.class));
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
     }
 
     /**
@@ -88,7 +87,7 @@ public abstract class AbstractAttributeReleaseAction extends AbstractConsentActi
      * 
      * @param strategy the attribute context lookup strategy
      */
-    public void setAttributeContextLookupStrategy(final Function<ProfileRequestContext, AttributeContext> strategy) {
+    public void setAttributeContextLookupStrategy(final Function<ProfileRequestContext,AttributeContext> strategy) {
         attributeContextLookupStrategy =
                 Constraint.isNotNull(strategy, "Attribute context lookup strategy cannot be null");
     }
@@ -99,7 +98,7 @@ public abstract class AbstractAttributeReleaseAction extends AbstractConsentActi
      * @param strategy the attribute release context lookup strategy
      */
     public void setAttributeReleaseContextLookupStrategy(
-            @Nonnull final Function<ProfileRequestContext, AttributeReleaseContext> strategy) {
+            @Nonnull final Function<ProfileRequestContext,AttributeReleaseContext> strategy) {
         attributeReleaseContextLookupStrategy =
                 Constraint.isNotNull(strategy, "Attribute release context lookup strategy cannot be null");
     }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptor.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptor.java
index 00e0b1c..38efcbb 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptor.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptor.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.consent.flow.ar.impl;
 
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -27,8 +28,6 @@ import net.shibboleth.idp.consent.logic.impl.AttributeValuesHashFunction;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
-import com.google.common.base.Function;
-
 /**
  * Descriptor for an attribute release flow.
  */
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContext.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContext.java
index 6179ff8..9c6db1e 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContext.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/ar/impl/PopulateAttributeReleaseContext.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.consent.flow.ar.impl;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -33,8 +34,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 /**
  * Attribute consent action to populate the attribute consent context with the attributes for which consent should be
  * obtained. A predicate is used to determine whether consent should be obtained for each IdP attribute in the attribute
@@ -89,7 +88,7 @@ public class PopulateAttributeReleaseContext extends AbstractAttributeReleaseAct
 
         final Map<String, IdPAttribute> consentableAttributes = new TreeMap<>(attributeIdComparator);
         for (final IdPAttribute attribute : attributes.values()) {
-            if (attributePredicate.apply(attribute)) {
+            if (attributePredicate.test(attribute)) {
                 consentableAttributes.put(attribute.getId(), attribute);
             }
         }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/AbstractConsentAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/AbstractConsentAction.java
index f7144e2..0463363 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/AbstractConsentAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/AbstractConsentAction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.consent.flow.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -32,8 +34,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for consent actions.
  * 
@@ -57,11 +57,11 @@ public abstract class AbstractConsentAction extends AbstractProfileInterceptorAc
     @Nullable private ConsentFlowDescriptor consentFlowDescriptor;
 
     /** Strategy used to find the {@link ConsentContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, ConsentContext> consentContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ConsentContext> consentContextLookupStrategy;
 
     /** Constructor. */
     public AbstractConsentAction() {
-        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class, false);
+        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
     }
 
     /**
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContext.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContext.java
index 97ebe73..2ca3b5f 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContext.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContext.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.consent.flow.impl;
 
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -29,8 +30,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Consent action which populates the current consents of a consent context with the output value of a function whose
  * input value is a profile request context.
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 01a23ec..c786b51 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
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -45,8 +46,6 @@ import org.opensaml.storage.StorageSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for consent actions which write to a {@link org.opensaml.storage.StorageService}.
  * 
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 b43e010..5d5e9ca 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,6 +17,8 @@
 
 package net.shibboleth.idp.consent.flow.storage.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -36,8 +38,6 @@ import org.opensaml.storage.StorageService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for consent actions which interact with a {@link StorageService}.
  * 
@@ -63,10 +63,10 @@ public abstract class AbstractConsentStorageAction extends AbstractConsentAction
     @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractConsentStorageAction.class);
 
     /** Strategy used to determine the storage context. */
-    @NonnullAfterInit private Function<ProfileRequestContext, String> storageContextLookupStrategy;
+    @NonnullAfterInit private Function<ProfileRequestContext,String> storageContextLookupStrategy;
 
     /** Strategy used to determine the storage key. */
-    @NonnullAfterInit private Function<ProfileRequestContext, String> storageKeyLookupStrategy;
+    @NonnullAfterInit private Function<ProfileRequestContext,String> storageKeyLookupStrategy;
 
     /** Storage serializer. */
     @NonnullAfterInit private StorageSerializer storageSerializer;
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 4ce672e..df380b8 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
@@ -22,15 +22,13 @@ import java.util.Enumeration;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-
-import com.google.common.base.Function;
 
 /**
  * Abstract Function which returns {@link Locale}-aware information about an attribute. The abstract method
@@ -68,7 +66,7 @@ public abstract class AbstractAttributeDisplayFunction implements Function<IdPAt
     }
 
     /** {@inheritDoc} */
-    @Override @Nonnull @NotEmpty public String apply(@Nullable final IdPAttribute input) {
+    @Nullable public String apply(@Nullable final IdPAttribute input) {
         if (input == null) {
             return "N/A";
         }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayDescriptionFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayDescriptionFunction.java
index 8bd4cb9..3ce732d 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayDescriptionFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayDescriptionFunction.java
@@ -27,14 +27,11 @@ import javax.servlet.http.HttpServletRequest;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 
-import com.google.common.base.Function;
-
 /**
  * Function which returns the locale-aware display description of an attribute, defaulting to the
  * attribute ID if the attribute has no display description.
  */
-public class AttributeDisplayDescriptionFunction extends AbstractAttributeDisplayFunction implements
-        Function<IdPAttribute, String> {
+public class AttributeDisplayDescriptionFunction extends AbstractAttributeDisplayFunction {
 
     /**
      * Constructor.
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameFunction.java
index ad1b8c4..a65b821 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameFunction.java
@@ -27,14 +27,11 @@ import javax.servlet.http.HttpServletRequest;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 
-import com.google.common.base.Function;
-
 /**
  * Function which returns the locale-aware display name of an attribute, defaulting to the
  * attribute ID if the attribute has no display name.
  */
-public class AttributeDisplayNameFunction extends AbstractAttributeDisplayFunction implements
-        Function<IdPAttribute, String> {
+public class AttributeDisplayNameFunction extends AbstractAttributeDisplayFunction {
 
     /**
      * Constructor.
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 6f26d5a..9962952 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
@@ -32,10 +32,9 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate to determine whether consent should be obtained for an attribute.
  */
@@ -90,8 +89,7 @@ public class AttributePredicate extends AbstractInitializableComponent implement
     }
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final IdPAttribute input) {
+    public boolean test(@Nullable final IdPAttribute input) {
 
         if (input == null) {
             return false;
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
index f154473..60418f2 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeReleaseConsentFunction.java
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -36,8 +37,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Function that returns a map of consent objects representing consent to attribute release. Each consent object
  * represents consent to an attribute. The id of each consent object is an attribute id, and the value of each consent
@@ -47,23 +46,22 @@ import com.google.common.base.Function;
 public class AttributeReleaseConsentFunction implements Function<ProfileRequestContext, Map<String, Consent>> {
 
     /** Strategy used to find the {@link ConsentContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, ConsentContext> consentContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ConsentContext> consentContextLookupStrategy;
 
     /** Consent flow descriptor lookup strategy. */
-    @Nonnull private Function<ProfileRequestContext, ConsentFlowDescriptor> consentFlowDescriptorLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ConsentFlowDescriptor> consentFlowDescriptorLookupStrategy;
 
     /** Strategy used to find the {@link AttributeReleaseContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, AttributeReleaseContext> attributeReleaseContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,AttributeReleaseContext> attributeReleaseContextLookupStrategy;
 
     /** Function used to compute the hash of an attribute's values. */
     @Nonnull private Function<Collection<IdPAttributeValue<?>>, String> attributeValuesHashFunction;
 
     /** Constructor. */
     public AttributeReleaseConsentFunction() {
-        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class, false);
-        consentFlowDescriptorLookupStrategy =
-                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
-        attributeReleaseContextLookupStrategy = new ChildContextLookup<>(AttributeReleaseContext.class, false);
+        consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
+        consentFlowDescriptorLookupStrategy = new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
+        attributeReleaseContextLookupStrategy = new ChildContextLookup<>(AttributeReleaseContext.class);
         attributeValuesHashFunction = new AttributeValuesHashFunction();
     }
 
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunction.java
index 6b160ba..515a502 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunction.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.consent.logic.impl;
 
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,9 +38,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * {@link ContextDataLookupFunction} to return the value of an attribute from an {@link AttributeContext}.
  */
@@ -52,7 +50,7 @@ public class AttributeValueLookupFunction implements ContextDataLookupFunction<P
     @Nonnull @NotEmpty private String attributeId;
 
     /** Strategy used to find the {@link AttributeContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, AttributeContext> attributeContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,AttributeContext> attributeContextLookupStrategy;
     
     /** Whether to use filtered or unfiltered attributes. */
     private boolean useUnfilteredAttributes;
@@ -68,8 +66,8 @@ public class AttributeValueLookupFunction implements ContextDataLookupFunction<P
                         "User attribute ID cannot be null nor empty");
 
         attributeContextLookupStrategy =
-                Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                        new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(RelyingPartyContext.class));
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         
         useUnfilteredAttributes = true;
     }
@@ -97,7 +95,6 @@ public class AttributeValueLookupFunction implements ContextDataLookupFunction<P
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
 
         final AttributeContext attributeContext = attributeContextLookupStrategy.apply(input);
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 886eb3d..5e058c9 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
@@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -39,7 +40,6 @@ import org.opensaml.saml.saml2.core.NameIDType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -57,7 +57,6 @@ public class AttributeValuesHashFunction implements Function<Collection<IdPAttri
     @Nonnull private final Logger log = LoggerFactory.getLogger(AttributeValuesHashFunction.class);
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable @NullableElements final Collection<IdPAttributeValue<?>> input) {
 
         if (input == null) {
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 bf48edc..414589d 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
@@ -23,6 +23,7 @@ import java.util.Comparator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -43,7 +44,6 @@ import org.opensaml.storage.StorageService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 
 /**
@@ -60,10 +60,10 @@ public class CounterStorageKeyFunction extends AbstractInitializableComponent im
     @Nonnull private final Logger log = LoggerFactory.getLogger(CounterStorageKeyFunction.class);
 
     /** Strategy used to find the {@link ProfileInterceptorContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, ProfileInterceptorContext> interceptorContextlookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ProfileInterceptorContext> interceptorContextlookupStrategy;
 
     /** Strategy used to determine the storage storageContext. */
-    @Nonnull private Function<ProfileRequestContext, String> storageContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,String> storageContextLookupStrategy;
 
     /** Constructor. */
     public CounterStorageKeyFunction() {
@@ -201,7 +201,7 @@ public class CounterStorageKeyFunction extends AbstractInitializableComponent im
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public List<String> apply(@Nullable final Pair<ProfileRequestContext, List<String>> input) {
+    @Nullable public List<String> apply(@Nullable final Pair<ProfileRequestContext, List<String>> input) {
         if (input == null || input.getFirst() == null || input.getSecond() == null) {
             return null;
         }
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 23498cb..e62c0c3 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.consent.logic.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -27,8 +29,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Function that returns a profile interceptor flow descriptor from a profile request context using a lookup strategy.
  *
@@ -41,7 +41,7 @@ public class FlowDescriptorLookupFunction<T extends ProfileInterceptorFlowDescri
     @Nonnull private final Class<T> interceptorFlowDescriptorType;
 
     /** Profile interceptor context lookup strategy. */
-    @Nonnull private Function<ProfileRequestContext, ProfileInterceptorContext> interceptorContextlookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,ProfileInterceptorContext> interceptorContextlookupStrategy;
 
     /**
      * Constructor.
@@ -66,8 +66,7 @@ public class FlowDescriptorLookupFunction<T extends ProfileInterceptorFlowDescri
     }
 
     /** {@inheritDoc} */
-    @Override
-    @Nullable public T apply(final ProfileRequestContext input) {
+    @Nullable public T apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
         }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunction.java
index f47e856..367e476 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunction.java
@@ -39,7 +39,7 @@ public class FlowIdLookupFunction implements ContextDataLookupFunction<ProfileRe
     @Nonnull private final Logger log = LoggerFactory.getLogger(FlowIdLookupFunction.class);
 
     /** {@inheritDoc} */
-    @Override @Nullable public String apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
         }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/GlobalAttributeConsentPredicate.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/GlobalAttributeConsentPredicate.java
index d3af783..9f41aff 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/GlobalAttributeConsentPredicate.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/GlobalAttributeConsentPredicate.java
@@ -18,21 +18,20 @@
 package net.shibboleth.idp.consent.logic.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.context.ConsentContext;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * Predicate to determine whether global consent has been given by user.
  */
@@ -50,8 +49,7 @@ public class GlobalAttributeConsentPredicate implements Predicate<ProfileRequest
     }
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return false;
         }
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/HashFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/HashFunction.java
index ecb2b50..91d10ff 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/HashFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/HashFunction.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.consent.logic.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.cryptacular.util.CodecUtil;
 import org.cryptacular.util.HashUtil;
 
-import com.google.common.base.Function;
-
 /**
  * Function whose output value is a hash of the input value.
  * 
@@ -42,6 +42,7 @@ public class HashFunction implements Function<String, String> {
             return null;
         }
 
+        // TODO: replace these with more standard calls
         return CodecUtil.b64(HashUtil.sha256(input));
     }
-}
+}
\ No newline at end of file
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 6a7c576..d64bf06 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.consent.logic.impl;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -35,14 +36,12 @@ import org.opensaml.saml.saml2.metadata.AttributeConsumingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
 import com.google.common.collect.Multimap;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.saml.attribute.mapping.AttributesMapContainer;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 /**
  * Predicate that determines whether an IdP attribute is required by the requester.
@@ -53,13 +52,13 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
     @Nonnull private final Logger log = LoggerFactory.getLogger(IsAttributeRequiredPredicate.class);
 
     /** Strategy used to find the {@link SAMLMetadataContext} from the {@link ProfileRequestContext}. */
-    @Nonnull private Function<ProfileRequestContext, SAMLMetadataContext> metadataContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,SAMLMetadataContext> metadataContextLookupStrategy;
 
     /** Strategy used to find the {@link AttributeConsumingService} from the {@link SAMLMetadataContext}. */
-    @Nonnull private Function<SAMLMetadataContext, AttributeConsumingService> acsLookupStrategy;
+    @Nonnull private Function<SAMLMetadataContext,AttributeConsumingService> acsLookupStrategy;
 
     /** Map of requested attributes. */
-    @Nullable private final Multimap<String, IdPRequestedAttribute> requestedAttributesMap;
+    @Nullable private final Multimap<String,IdPRequestedAttribute> requestedAttributesMap;
 
     /**
      * Constructor.
@@ -67,11 +66,13 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
      * @param request the HTTP request
      */
     public IsAttributeRequiredPredicate(@Nullable final HttpServletRequest request) {
-        metadataContextLookupStrategy = Functions.compose(new ChildContextLookup<>(SAMLMetadataContext.class), Functions
-                .compose(new ChildContextLookup<>(SAMLPeerEntityContext.class), new OutboundMessageContextLookup()));
-        acsLookupStrategy = Functions.compose(new AttributeConsumerServiceLookupFunction(),
-                new ChildContextLookup<SAMLMetadataContext, AttributeConsumingServiceContext>(
-                        AttributeConsumingServiceContext.class));
+        metadataContextLookupStrategy =
+                new ChildContextLookup<>(SAMLMetadataContext.class).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                                new OutboundMessageContextLookup()));
+        acsLookupStrategy =
+                new AttributeConsumerServiceLookupFunction().compose(
+                        new ChildContextLookup<>(AttributeConsumingServiceContext.class));
         final ProfileRequestContext prc = getProfileRequestContext(request);
         requestedAttributesMap = getRequestedAttributes(prc);
     }
@@ -125,7 +126,7 @@ public class IsAttributeRequiredPredicate implements Predicate<IdPAttribute> {
     }
 
     /** {@inheritDoc} */
-    public boolean apply(@Nullable final IdPAttribute input) {
+    public boolean test(@Nullable final IdPAttribute input) {
         if (input != null && requestedAttributesMap != null && !requestedAttributesMap.isEmpty()) {
             final Collection<IdPRequestedAttribute> requestedAttrs = requestedAttributesMap.get(input.getId());
             if (requestedAttrs != null) {
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsConsentRequiredPredicate.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsConsentRequiredPredicate.java
index 0064719..52f39f9 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsConsentRequiredPredicate.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/IsConsentRequiredPredicate.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.consent.logic.impl;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -27,15 +28,13 @@ import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.context.ConsentContext;
 import net.shibboleth.idp.consent.flow.impl.ConsentFlowDescriptor;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * Predicate that returns whether consent is required by comparing the previous and current consents from the consent
  * context.
@@ -54,8 +53,7 @@ public class IsConsentRequiredPredicate implements Predicate<ProfileRequestConte
     /** Constructor. */
     public IsConsentRequiredPredicate() {
         consentContextLookupStrategy = new ChildContextLookup<>(ConsentContext.class);
-        consentFlowDescriptorLookupStrategy =
-                new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
+        consentFlowDescriptorLookupStrategy = new FlowDescriptorLookupFunction<>(ConsentFlowDescriptor.class);
     }
 
     /**
@@ -80,7 +78,7 @@ public class IsConsentRequiredPredicate implements Predicate<ProfileRequestConte
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             log.debug("Consent is not required, no profile request context");
             return false;
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/JoinFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/JoinFunction.java
index 603abe4..ebaf6e6 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/JoinFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/JoinFunction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.consent.logic.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -26,13 +28,12 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 
 /**
  * Function to join the result of two functions with a separator.
  */
-public class JoinFunction implements Function<ProfileRequestContext, String> {
+public class JoinFunction implements Function<ProfileRequestContext,String> {
 
     /** Separator. */
     @Nonnull public static final String SEPARATOR = ":";
@@ -68,7 +69,6 @@ public class JoinFunction implements Function<ProfileRequestContext, String> {
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/LocaleLookupFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/LocaleLookupFunction.java
index 5b54ffe..ccc41a7 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/LocaleLookupFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/LocaleLookupFunction.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.consent.logic.impl;
 
 import java.util.Locale;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -25,15 +26,12 @@ import net.shibboleth.idp.profile.context.SpringRequestContext;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Function which resolves the {@link Locale} from a {@link ProfileRequestContext}.
  */
 public class LocaleLookupFunction implements Function<ProfileRequestContext, Locale> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Locale apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
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 0a7227c..1153316 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.consent.logic.impl;
 import java.util.Collections;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -38,8 +39,6 @@ import org.springframework.context.MessageSource;
 import org.springframework.context.MessageSourceAware;
 import org.springframework.context.NoSuchMessageException;
 
-import com.google.common.base.Function;
-
 /**
  * Function that returns a consent object whose id and value are resolved from a lookup function
  * and {@link MessageSource}.
@@ -142,7 +141,6 @@ public class MessageSourceConsentFunction extends AbstractInitializableComponent
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Map<String,Consent> apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
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 740dfe9..c46412a 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
@@ -63,7 +63,7 @@ public class PreferExplicitOrderComparator implements Comparator<String> {
             explicitOrder = Collections.emptyList();
         } else {
             // trimmed
-            explicitOrder = Lists.transform(order, TrimOrNullStringFunction.INSTANCE);
+            explicitOrder = Lists.transform(order, TrimOrNullStringFunction.INSTANCE::apply);
 
             // non-null
             explicitOrder = ImmutableList.copyOf(Iterables.filter(explicitOrder, Predicates.notNull()));
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptorTest.java
index 177452d..457ce2d 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AttributeReleaseFlowDescriptorTest.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.consent.flow.ar.impl;
 
 import java.util.Collection;
+import java.util.function.Function;
 
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.consent.logic.impl.AttributeValuesHashFunction;
@@ -28,8 +29,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** {@link AttributeReleaseFlowDescriptor} unit test. */
 public class AttributeReleaseFlowDescriptorTest {
 
@@ -59,7 +58,7 @@ public class AttributeReleaseFlowDescriptorTest {
     }
 
     @Test public void testSettingAttributeValuesHashFunction() throws Exception {
-        Function<Collection<IdPAttributeValue<?>>, String> function = new AttributeValuesHashFunction();
+        final Function<Collection<IdPAttributeValue<?>>, String> function = new AttributeValuesHashFunction();
         descriptor.setAttributeValuesHashFunction(function);
         Assert.assertEquals(descriptor.getAttributeValuesHashFunction(), function);
     }
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 95ab128..3006452 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
@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.function.Predicate;
 
 import javax.annotation.Nullable;
 
@@ -42,7 +43,6 @@ import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Ordering;
 
@@ -175,7 +175,7 @@ public class PopulateAttributeReleaseContextTest extends AbstractAttributeReleas
     private class MockIdPAttributePredicate implements Predicate<IdPAttribute> {
 
         /** {@inheritDoc} */
-        public boolean apply(@Nullable final IdPAttribute input) {
+        public boolean test(@Nullable final IdPAttribute input) {
 
             if (input.getId().equals("attribute1") || input.getId().equals("attribute2")) {
                 return true;
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContextTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContextTest.java
index ffacef0..705606e 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContextTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/impl/PopulateConsentContextTest.java
@@ -17,23 +17,16 @@
 
 package net.shibboleth.idp.consent.flow.impl;
 
-import java.util.Map;
-
-import javax.annotation.Nonnull;
-
-import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.context.ConsentContext;
 import net.shibboleth.idp.consent.impl.ConsentTestingSupport;
 import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** {@link PopulateConsentContext} unit test. */
 public class PopulateConsentContextTest extends AbstractConsentActionTest {
 
@@ -44,7 +37,7 @@ public class PopulateConsentContextTest extends AbstractConsentActionTest {
     }
 
     @Test public void testCurrentConsentsFunction() throws Exception {
-        action = new PopulateConsentContext(new MockCurrentConsentsFunction());
+        action = new PopulateConsentContext(FunctionSupport.constant(ConsentTestingSupport.newConsentMap()));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -56,13 +49,4 @@ public class PopulateConsentContextTest extends AbstractConsentActionTest {
         Assert.assertEquals(consentContext.getCurrentConsents(), ConsentTestingSupport.newConsentMap());
     }
 
-    /** Mock function which returns current consents. */
-    private class MockCurrentConsentsFunction implements Function<ProfileRequestContext, Map<String, Consent>> {
-
-        /** {@inheritDoc} */
-        public Map<String, Consent> apply(@Nonnull final ProfileRequestContext input) {
-            return ConsentTestingSupport.newConsentMap();
-        }
-    }
-
-}
+}
\ No newline at end of file
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameDescriptionFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameDescriptionFunctionTest.java
index 53d61bb..b7f6bd2 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameDescriptionFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeDisplayNameDescriptionFunctionTest.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -32,7 +33,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Lists;
 
 /**
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributePredicateTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributePredicateTest.java
index 4b0a6ed..3630ccc 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributePredicateTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributePredicateTest.java
@@ -46,97 +46,97 @@ public class AttributePredicateTest {
 
     @Test public void testWhitelist() {
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
-        Assert.assertTrue(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertTrue(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
     }
 
     @Test public void testBlacklist() {
         p.setBlacklistedAttributeIds(Arrays.asList("attribute1"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertTrue(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertTrue(p.test(attribute2));
     }
 
     @Test public void testMatchExpression() {
         p.setAttributeIdMatchExpression(Pattern.compile(".*1"));
-        Assert.assertTrue(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertTrue(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
     }
 
     @Test public void testWhitelistAndBlacklist() {
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setBlacklistedAttributeIds(Arrays.asList("attribute1"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
 
         p.setBlacklistedAttributeIds(Arrays.asList("attribute2"));
-        Assert.assertTrue(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertTrue(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
     }
 
     @Test public void testWhitelistAndMatchExpression() {
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*1"));
-        Assert.assertTrue(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertTrue(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
 
         p.setAttributeIdMatchExpression(Pattern.compile(".*2"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertTrue(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertTrue(p.test(attribute2));
     }
 
     @Test public void testBlacklistAndMatchExpression() {
         p.setBlacklistedAttributeIds(Arrays.asList("attribute1"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*1"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
 
         p.setAttributeIdMatchExpression(Pattern.compile(".*2"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertTrue(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertTrue(p.test(attribute2));
     }
 
     @Test public void testWhitelistAndBlacklistAndMatchExpression() {
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setBlacklistedAttributeIds(Arrays.asList("attribute1"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*1"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
 
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setBlacklistedAttributeIds(Arrays.asList("attribute2"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*1"));
-        Assert.assertTrue(p.apply(attribute1));
-        Assert.assertFalse(p.apply(attribute2));
+        Assert.assertTrue(p.test(attribute1));
+        Assert.assertFalse(p.test(attribute2));
 
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setBlacklistedAttributeIds(Arrays.asList("attribute1"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*2"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertTrue(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertTrue(p.test(attribute2));
 
         p.setWhitelistedAttributeIds(Arrays.asList("attribute1"));
         p.setBlacklistedAttributeIds(Arrays.asList("attribute2"));
         p.setAttributeIdMatchExpression(Pattern.compile(".*2"));
-        Assert.assertFalse(p.apply(attribute1));
-        Assert.assertTrue(p.apply(attribute2));
+        Assert.assertFalse(p.test(attribute1));
+        Assert.assertTrue(p.test(attribute2));
     }
 
     @Test public void testNullInput() {
         p = new AttributePredicate();
-        Assert.assertFalse(p.apply(null));
+        Assert.assertFalse(p.test(null));
     }
 
     @Test public void testEmptyAttribute() {
         // no values
         final IdPAttribute emptyAttribute = new IdPAttribute("emptyAttribute");
-        Assert.assertFalse(p.apply(emptyAttribute));
+        Assert.assertFalse(p.test(emptyAttribute));
 
         // empty values
         emptyAttribute.setValues(Arrays.asList(StringAttributeValue.valueOf(""), StringAttributeValue.valueOf(null)));
-        Assert.assertFalse(p.apply(emptyAttribute));
+        Assert.assertFalse(p.test(emptyAttribute));
 
         // empty and non-empty values
         emptyAttribute.setValues(Arrays.asList(StringAttributeValue.valueOf("1"), StringAttributeValue.valueOf("")));
-        Assert.assertTrue(p.apply(emptyAttribute));
+        Assert.assertTrue(p.test(emptyAttribute));
     }
 }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/JoinFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/JoinFunctionTest.java
index cee635f..3f2e166 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/JoinFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/JoinFunctionTest.java
@@ -21,14 +21,14 @@ import net.shibboleth.idp.profile.RequestContextBuilder;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
+import java.util.function.Function;
+
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.webflow.execution.RequestContext;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** {@link JoinFunction} unit test. */
 public class JoinFunctionTest {
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializerTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializerTest.java
index 6bdaac7..0912513 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializerTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/ConsentSerializerTest.java
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -39,8 +40,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** Unit tests for {@link ConsentSerializer}. */
 public class ConsentSerializerTest {
 
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 5963419..8505a2b 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.profile;
 
 import java.text.MessageFormat;
 import java.util.Locale;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -45,8 +46,6 @@ import org.springframework.webflow.execution.Action;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for Spring-aware profile actions.
  * 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
index dec25f2..14def85 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractConditionalProfileConfiguration.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.profile.config;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 import net.shibboleth.utilities.java.support.annotation.ParameterName;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
index 90367dd..fb8cff2 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/AbstractProfileConfiguration.java
@@ -22,12 +22,12 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.servlet.ServletRequest;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 
 import net.shibboleth.utilities.java.support.annotation.ParameterName;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/ConditionalProfileConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/ConditionalProfileConfiguration.java
index fc93867..dff195c 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/ConditionalProfileConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/ConditionalProfileConfiguration.java
@@ -17,12 +17,12 @@
 
 package net.shibboleth.idp.profile.config;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * A {@link ProfileConfiguration} supporting an activation condition.
  * 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
index 6fef581..80d5924 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/logic/DetailedErrorsPredicate.java
@@ -30,11 +30,11 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class DetailedErrorsPredicate extends AbstractRelyingPartyPredicate {
 
     /** {@inheritDoc} */
-    @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
             if (rpc != null && rpc.getConfiguration() != null) {
-                return rpc.getConfiguration().getDetailedErrorsPredicate().apply(input);
+                return rpc.getConfiguration().getDetailedErrorsPredicate().test(input);
             }
         }
         
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SelfEncryptionConfigurationLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SelfEncryptionConfigurationLookupFunction.java
index 634da82..f248191 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SelfEncryptionConfigurationLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/SelfEncryptionConfigurationLookupFunction.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.profile.config.navigate;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -29,8 +30,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.xmlsec.EncryptionConfiguration;
 import org.opensaml.xmlsec.SecurityConfigurationSupport;
 
-import com.google.common.base.Function;
-
 /**
  * A function that returns a {@link EncryptionConfiguration} list intended for self-encryption cases.
  * 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/RelyingPartyContext.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/RelyingPartyContext.java
index feadb98..b6bf67d 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/RelyingPartyContext.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/RelyingPartyContext.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.context;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -27,8 +29,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.messaging.context.BaseContext;
 
-import com.google.common.base.Function;
-
 /**
  * {@link BaseContext} containing relying party specific information, usually a
  * subcontext of {@link org.opensaml.profile.context.ProfileRequestContext}.
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/AbstractRelyingPartyLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/AbstractRelyingPartyLookupFunction.java
index 7ec7d2e..d027b60 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/AbstractRelyingPartyLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/AbstractRelyingPartyLookupFunction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
@@ -26,8 +28,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Abstract base class for a function that requires a {@link RelyingPartyContext}
  * obtained via a lookup function, by default a child of the {@link ProfileRequestContext}.
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByCurrent.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByCurrent.java
index f0a315a..04f7389 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByCurrent.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByCurrent.java
@@ -29,7 +29,6 @@ public class RelyingPartyContextLookupByCurrent
         implements ContextDataLookupFunction<MultiRelyingPartyContext,RelyingPartyContext> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public RelyingPartyContext apply(@Nullable final MultiRelyingPartyContext input) {
         if (input == null) {
             return null;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
index 86dd1e3..c1cc0f1 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupById.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -28,8 +30,6 @@ import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
-import com.google.common.base.Function;
-
 /**
  * A function that returns a {@link RelyingPartyContext} based on ID.
  * 
@@ -56,7 +56,6 @@ public class RelyingPartyContextLookupById
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public RelyingPartyContext apply(@Nullable final Pair<MultiRelyingPartyContext,String> input) {
         if (input == null || input.getFirst() == null) {
             return null;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
index fa2fcac..1dbd96a 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyContextLookupByLabel.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.profile.context.navigate;
 
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,8 +30,6 @@ import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
-import com.google.common.base.Function;
-
 /**
  * A function that returns a collection of {@link RelyingPartyContext}s based on a label.
  */
@@ -50,7 +49,6 @@ public class RelyingPartyContextLookupByLabel
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Collection<RelyingPartyContext> apply(@Nullable final MultiRelyingPartyContext input) {
         if (input == null) {
             return null;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyIdLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyIdLookupFunction.java
index 4dd2bf6..3e67d56 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyIdLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/RelyingPartyIdLookupFunction.java
@@ -32,7 +32,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class RelyingPartyIdLookupFunction extends AbstractRelyingPartyLookupFunction<String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
index 6d0d75b..592fa0b 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ResponderIdLookupFunction.java
@@ -35,7 +35,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class ResponderIdLookupFunction extends AbstractRelyingPartyLookupFunction<String> {
 
     /** {@inheritDoc} */
-    @Override @Nullable public String apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
             if (rpc != null && rpc.getConfiguration() != 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 f4118f0..279ac32 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
@@ -37,7 +37,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.core.io.Resource;
 
 /**
- * A {@link com.google.common.base.Function} over a {@link BaseContext}
+ * A {@link java.util.function.Function} over a {@link BaseContext}
  * which calls out to a supplied script.
  * 
  * @param <T> the specific type of context
@@ -95,7 +95,6 @@ public class ScriptedContextLookupFunction<T extends BaseContext> extends Abstra
     }
 
     /** {@inheritDoc} */
-    @Override
     public Object apply(@Nullable final T context) {
 
         if (null != context && !inputClass.isInstance(context)) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ServletRequestProfileRequestContextLookup.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ServletRequestProfileRequestContextLookup.java
index 6d7ccb5..39c6386 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ServletRequestProfileRequestContextLookup.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/ServletRequestProfileRequestContextLookup.java
@@ -17,9 +17,10 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
-import com.google.common.base.Function;
 import org.opensaml.profile.context.ProfileRequestContext;
 
+import java.util.function.Function;
+
 import javax.annotation.Nullable;
 import javax.servlet.ServletRequest;
 
@@ -28,10 +29,10 @@ import javax.servlet.ServletRequest;
  *
  * @author Marvin S. Addison
  */
-public class ServletRequestProfileRequestContextLookup implements Function<ServletRequest, ProfileRequestContext> {
+public class ServletRequestProfileRequestContextLookup implements Function<ServletRequest,ProfileRequestContext> {
 
+    /** {@inheritDoc} */
     @Nullable
-    @Override
     public ProfileRequestContext apply(final ServletRequest input) {
         return (ProfileRequestContext) input.getAttribute(ProfileRequestContext.BINDING_KEY);
     }
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
index 87b4726..291bb86 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringEventToViewLookupFunction.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.profile.context.navigate;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,8 +30,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.springframework.webflow.execution.Event;
 
-import com.google.common.base.Function;
-
 /**
  * A function that returns a view name to render based on a Spring Web Flow {@link Event}.
  */
@@ -77,7 +76,6 @@ public class SpringEventToViewLookupFunction implements Function<Event,String> {
     }
     
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final Event input) {
         
         if (input != null) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunction.java
index 78f4f13..e3fe776 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringExpressionContextLookupFunction.java
@@ -30,7 +30,7 @@ import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 import org.slf4j.LoggerFactory;
 
 /**
- * A {@link com.google.common.base.Function} over a {@link BaseContext}
+ * A {@link java.util.function.Function} over a {@link BaseContext}
  * which calls out to a Spring Expression.
  * 
  * @param <T> the specific type of context
@@ -104,7 +104,7 @@ public class SpringExpressionContextLookupFunction<T extends BaseContext>
     }
 
     /** {@inheritDoc} */
-    @Override public Object apply(@Nullable final T context) {
+    @Nullable public Object apply(@Nullable final T context) {
         return embeddedObject.apply(context);
     }
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
index bc7804a..4a705f6 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/SpringStatusMessageLookupFunction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -29,8 +31,6 @@ import org.springframework.context.NoSuchMessageException;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * A function that returns a status message to include, if any, in a SAML response based on the current
  * profile request context state, using Spring's {@link MessageSource} functionality.
@@ -41,7 +41,6 @@ public class SpringStatusMessageLookupFunction implements Function<ProfileReques
     @Nonnull private MessageSource messageSource;
     
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         if (input != null && messageSource != null) {
             final SpringRequestContext springContext = input.getSubcontext(SpringRequestContext.class);
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
index 59f67c5..bfc1786 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.profile.context.navigate;
 
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -28,8 +29,6 @@ import org.opensaml.profile.context.PreviousEventContext;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * A {@link Function} that checks for cases in which the webflow's current event is not reflected by
  * an attached {@link EventContext} and compensates, along with returning a suitably populated context.
@@ -37,7 +36,6 @@ import com.google.common.base.Function;
 public class WebFlowCurrentEventLookupFunction implements Function<ProfileRequestContext,EventContext> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public EventContext apply(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return null;
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
index 4f6dc9b..72c1681 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebflowRequestContextProfileRequestContextLookup.java
@@ -17,13 +17,13 @@
 
 package net.shibboleth.idp.profile.context.navigate;
 
+import java.util.function.Function;
+
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * A {@link Function} that extracts the {@link ProfileRequestContext} from the current Webflow conversation. It is
  * expected that the {@link ProfileRequestContext} will be bound to the conversation attribute identified by
@@ -33,7 +33,6 @@ public class WebflowRequestContextProfileRequestContextLookup implements
         Function<RequestContext,ProfileRequestContext> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public ProfileRequestContext apply(@Nullable final RequestContext requestContext) {
         final Object ctx = requestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
         if (ctx instanceof ProfileRequestContext) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/messaging/AbstractRelyingPartyLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/messaging/AbstractRelyingPartyLookupFunction.java
index 82c4c19..450c7f8 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/messaging/AbstractRelyingPartyLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/messaging/AbstractRelyingPartyLookupFunction.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.context.navigate.messaging;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 import org.opensaml.messaging.context.InOutOperationContext;
@@ -25,9 +27,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 import org.opensaml.messaging.context.navigate.RecursiveTypedParentContextLookup;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
@@ -48,10 +47,9 @@ public abstract class AbstractRelyingPartyLookupFunction<ResultType>
     
     /** Constructor. */
     public AbstractRelyingPartyLookupFunction() {
-        relyingPartyContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<InOutOperationContext, RelyingPartyContext>(RelyingPartyContext.class),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
+        relyingPartyContextLookupStrategy =
+                new ChildContextLookup<>(RelyingPartyContext.class).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
     }
 
     /**
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 7311115..aff2438 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.interceptor;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -32,8 +34,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A base class for profile interceptor actions.
  * 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
index 8c02ad6..67dd00a 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.interceptor;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -30,7 +32,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.storage.StorageService;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -116,8 +117,8 @@ public class ProfileInterceptorFlowDescriptor extends AbstractIdentifiableInitia
     }
 
     /** {@inheritDoc} */
-    @Override public boolean apply(final ProfileRequestContext input) {
-        return activationCondition.apply(input);
+    public boolean test(@Nullable final ProfileRequestContext input) {
+        return activationCondition.test(input);
     }
 
     /** {@inheritDoc} */
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractAttributePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractAttributePredicate.java
index 1fd7559..7c64d1f 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractAttributePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractAttributePredicate.java
@@ -17,14 +17,13 @@
 
 package net.shibboleth.idp.profile.logic;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.context.AttributeContext;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.logic.Predicate;
+
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
@@ -33,6 +32,7 @@ import org.slf4j.LoggerFactory;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import java.util.Map;
+import java.util.function.Function;
 
 /**
  * Abstract base class for predicates operating on an {@link AttributeContext}.
@@ -50,8 +50,9 @@ public abstract class AbstractAttributePredicate implements Predicate<ProfileReq
 
     /** Constructor. */
     public AbstractAttributePredicate() {
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         useUnfilteredAttributes = true;
     }
     
@@ -97,8 +98,7 @@ public abstract class AbstractAttributePredicate implements Predicate<ProfileReq
     }
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         final AttributeContext attributeCtx = attributeContextLookupStrategy.apply(input);
         if (attributeCtx == null) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractRelyingPartyPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractRelyingPartyPredicate.java
index 1a4e377..d55a786 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractRelyingPartyPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/AbstractRelyingPartyPredicate.java
@@ -17,17 +17,17 @@
 
 package net.shibboleth.idp.profile.logic;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * Base class for a predicate that evaluates a {@link ProfileRequestContext} and requires access to a
  * {@link RelyingPartyContext}.
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 dbea89f..aceaec5 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
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.profile.logic;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Collections2;
@@ -41,6 +40,7 @@ import javax.annotation.Nullable;
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.function.Function;
 
 /**
  * Predicate over an {@link AttributeContext} that derives the value(s) to match based
@@ -78,8 +78,7 @@ public class DynamicAttributePredicate extends AbstractAttributePredicate {
     }
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         final AttributeContext attributeCtx = getAttributeContextLookupStrategy().apply(input);
         if (attributeCtx == null) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RelyingPartyIdPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RelyingPartyIdPredicate.java
index 626c90b..16a2da8 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RelyingPartyIdPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/RelyingPartyIdPredicate.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.profile.logic;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -31,8 +32,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate that evaluates a {@link ProfileRequestContext} by looking for a relying party ID
  * that matches one of a designated set, or a generic predicate. The ID is obtained from a
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
index 07c9e77..bcc34a9 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/ScriptedPredicate.java
@@ -35,10 +35,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.Resource;
 
-import com.google.common.base.Predicate;
-
 /**
- * A {@link Predicate} which calls out to a supplied script.
+ * A {@link java.util.function.Predicate} which calls out to a supplied script.
  */
 public class ScriptedPredicate
         extends net.shibboleth.utilities.java.support.logic.ScriptedPredicate<ProfileRequestContext> {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/VerifiedProfilePredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/VerifiedProfilePredicate.java
index f58c780..b6ab445 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/VerifiedProfilePredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/VerifiedProfilePredicate.java
@@ -29,7 +29,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class VerifiedProfilePredicate extends AbstractRelyingPartyPredicate {
 
     /** {@inheritDoc} */
-    @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input != null) {
             final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
             if (rpc != null) {
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/messaging/AbstractRelyingPartyPredicate.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/messaging/AbstractRelyingPartyPredicate.java
index 29ccbc1..4fd2b83 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/messaging/AbstractRelyingPartyPredicate.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/logic/messaging/AbstractRelyingPartyPredicate.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.logic.messaging;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 import org.opensaml.messaging.context.InOutOperationContext;
@@ -24,12 +26,9 @@ import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.messaging.context.navigate.RecursiveTypedParentContextLookup;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 /**
  * Abstract base class for a predicate that evaluates a {@link MessageContext} 
@@ -46,10 +45,9 @@ public abstract class AbstractRelyingPartyPredicate implements Predicate<Message
     
     /** Constructor. */
     public AbstractRelyingPartyPredicate() {
-        relyingPartyContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<InOutOperationContext, RelyingPartyContext>(RelyingPartyContext.class),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
+        relyingPartyContextLookupStrategy =
+                new ChildContextLookup<>(RelyingPartyContext.class).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
     }
 
     /**
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java b/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
index aeaba6e..da73005 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/relyingparty/RelyingPartyConfiguration.java
@@ -21,6 +21,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -42,8 +44,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableMap;
@@ -141,7 +141,7 @@ public class RelyingPartyConfiguration extends AbstractIdentifiableInitializable
      * @deprecated Use {@link #getDetailedErrorsPredicate()} instead.
      */
     public boolean isDetailedErrors() {
-        return detailedErrorsPredicate.apply(getProfileRequestContext());
+        return detailedErrorsPredicate.test(getProfileRequestContext());
     }
 
     /**
@@ -267,10 +267,10 @@ public class RelyingPartyConfiguration extends AbstractIdentifiableInitializable
     }
 
     /** {@inheritDoc} */
-    @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
 
-        return activationCondition.apply(input);
+        return activationCondition.test(input);
     }
 
     /**
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptorTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptorTest.java
index c2b431c..0531400 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptorTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/profile/interceptor/ProfileInterceptorFlowDescriptorTest.java
@@ -50,7 +50,7 @@ public class ProfileInterceptorFlowDescriptorTest {
         Assert.assertEquals(descriptor.getId(), "test");
         Assert.assertTrue(descriptor.isNonBrowserSupported());
         Assert.assertNull(descriptor.getStorageService());
-        Assert.assertTrue(descriptor.apply(prc));
+        Assert.assertTrue(descriptor.test(prc));
     }
 
     @Test(expectedExceptions = UnmodifiableComponentException.class)
@@ -88,7 +88,7 @@ public class ProfileInterceptorFlowDescriptorTest {
         descriptor.setActivationCondition(Predicates.<ProfileRequestContext> alwaysFalse());
         descriptor.initialize();
 
-        Assert.assertFalse(descriptor.apply(prc));
+        Assert.assertFalse(descriptor.test(prc));
     }
 
     @Test public void testMutatingNonBrowserSupport() {
diff --git a/idp-profile-api/src/test/java/net/shibboleth/idp/relyingparty/RelyingPartyConfigurationTest.java b/idp-profile-api/src/test/java/net/shibboleth/idp/relyingparty/RelyingPartyConfigurationTest.java
index d19fddf..8dc4348 100644
--- a/idp-profile-api/src/test/java/net/shibboleth/idp/relyingparty/RelyingPartyConfigurationTest.java
+++ b/idp-profile-api/src/test/java/net/shibboleth/idp/relyingparty/RelyingPartyConfigurationTest.java
@@ -44,7 +44,7 @@ public class RelyingPartyConfigurationTest {
         Assert.assertEquals(config.getId(), "foo");
         Assert.assertEquals(config.getResponderId(), "http://idp.example.org");
         Assert.assertTrue(config.isDetailedErrors());
-        Assert.assertTrue(config.getDetailedErrorsPredicate().apply(null));
+        Assert.assertTrue(config.getDetailedErrorsPredicate().test(null));
         Assert.assertTrue(config.getProfileConfigurations().isEmpty());
 
         config = new RelyingPartyConfiguration();
@@ -55,7 +55,7 @@ public class RelyingPartyConfigurationTest {
         Assert.assertEquals(config.getId(), "foo");
         Assert.assertEquals(config.getResponderId(), "http://idp.example.org");
         Assert.assertFalse(config.isDetailedErrors());
-        Assert.assertFalse(config.getDetailedErrorsPredicate().apply(null));
+        Assert.assertFalse(config.getDetailedErrorsPredicate().test(null));
         Assert.assertTrue(config.getProfileConfigurations().isEmpty());
 
         ArrayList<ProfileConfiguration> profileConfigs = new ArrayList<>();
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 bfbd942..82e6bc8 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
@@ -19,6 +19,8 @@ package net.shibboleth.idp.profile.audit.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -26,10 +28,6 @@ import javax.annotation.Nullable;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-
 import net.shibboleth.idp.attribute.context.AttributeContext;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -49,8 +47,8 @@ public class AttributesAuditExtractor implements Function<ProfileRequestContext,
     /** Constructor. */
     public AttributesAuditExtractor() {
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeContext.
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
     }
     
     /**
@@ -88,7 +86,7 @@ public class AttributesAuditExtractor implements Function<ProfileRequestContext,
     @Override
     @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         
-        if (activationCondition != null && !activationCondition.apply(input)) {
+        if (activationCondition != null && !activationCondition.test(input)) {
             return Collections.emptyList();
         }
         
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 9436fd5..e672433 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
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,8 +45,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that populates fields in an {@link AuditContext} using injected functions.
  * 
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
index 914856f..61c07c0 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -51,7 +52,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 
 /**
@@ -62,7 +62,7 @@ import com.google.common.collect.ImmutableMap;
 public class WriteAuditLog extends AbstractProfileAction {
 
     /** Formatter used to convert timestamps to strings. */
-    private static DateTimeFormatter v2Formatter = ISODateTimeFormat.basicDateTimeNoMillis();
+    @Nonnull private static DateTimeFormatter v2Formatter = ISODateTimeFormat.basicDateTimeNoMillis();
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(WriteAuditLog.class);
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/FilterAttributes.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/FilterAttributes.java
index bd457be..0b12606 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/FilterAttributes.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/FilterAttributes.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -50,9 +52,6 @@ import org.opensaml.saml.metadata.resolver.MetadataResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that invokes the {@link AttributeFilter} for the current request.
  * 
@@ -135,36 +134,34 @@ public class FilterAttributes extends AbstractProfileAction {
         issuerLookupStrategy = new ResponderIdLookupFunction();
         recipientLookupStrategy = new RelyingPartyIdLookupFunction();
         
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
 
-        principalNameLookupStrategy = Functions.compose(
-                new SubjectContextPrincipalLookupFunction(),
-                new ChildContextLookup<ProfileRequestContext,SubjectContext>(SubjectContext.class));
+        principalNameLookupStrategy =
+                new SubjectContextPrincipalLookupFunction().compose(
+                        new ChildContextLookup<>(SubjectContext.class));
         
         authnContextLookupStrategy = new ChildContextLookup<>(AuthenticationContext.class);
         
         // Default: inbound msg context -> SAMLPeerEntityContext -> SAMLMetadataContext
-        metadataContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLMetadataContext.class),
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class),
-                        new InboundMessageContextLookup()));
+        metadataContextLookupStrategy =
+                new ChildContextLookup<>(SAMLMetadataContext.class).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                                new InboundMessageContextLookup()));
                 
         // This is always set to navigate to the root context and then apply the previous function.
-        metadataFromFilterLookupStrategy = Functions.compose(metadataContextLookupStrategy,
-                new RootContextLookup<AttributeFilterContext,ProfileRequestContext>());
+        metadataFromFilterLookupStrategy = metadataContextLookupStrategy.compose(new RootContextLookup<>());
 
         // Default: inbound msg context -> child
-        proxiedRequesterContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(ProxiedRequesterContext.class), new InboundMessageContextLookup());
+        proxiedRequesterContextLookupStrategy =
+                new ChildContextLookup<>(ProxiedRequesterContext.class).compose(new InboundMessageContextLookup());
         
         // This is always set to navigate to the root context and then apply the previous function.
-        proxiesFromFilterLookupStrategy = Functions.compose(proxiedRequesterContextLookupStrategy,
-                new RootContextLookup<AttributeFilterContext,ProfileRequestContext>());
+        proxiesFromFilterLookupStrategy = proxiedRequesterContextLookupStrategy.compose(new RootContextLookup<>());
         
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeFilterContext.
-        filterContextCreationStrategy = Functions.compose(new ChildContextLookup<>(AttributeFilterContext.class, true),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        filterContextCreationStrategy = new ChildContextLookup<>(AttributeFilterContext.class, true).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
         
         maskFailures = true;
     }
@@ -271,8 +268,7 @@ public class FilterAttributes extends AbstractProfileAction {
 
         metadataContextLookupStrategy =
                 Constraint.isNotNull(strategy, "MetadataContext lookup strategy cannot be null");
-        metadataFromFilterLookupStrategy = Functions.compose(metadataContextLookupStrategy,
-                new RootContextLookup<AttributeFilterContext,ProfileRequestContext>());
+        metadataFromFilterLookupStrategy = metadataContextLookupStrategy.compose(new RootContextLookup<>());
     }
 
     /**
@@ -290,8 +286,7 @@ public class FilterAttributes extends AbstractProfileAction {
 
         proxiedRequesterContextLookupStrategy =
                 Constraint.isNotNull(strategy, "ProxiedRequesterContext lookup strategy cannot be null");
-        proxiesFromFilterLookupStrategy = Functions.compose(proxiedRequesterContextLookupStrategy,
-                new RootContextLookup<AttributeFilterContext,ProfileRequestContext>());
+        proxiesFromFilterLookupStrategy = proxiedRequesterContextLookupStrategy.compose(new RootContextLookup<>());
     }
     
     /**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/PopulateSubjectContext.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/PopulateSubjectContext.java
index f184a95..d7ac07d 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/PopulateSubjectContext.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/PopulateSubjectContext.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -33,9 +35,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
-
 /**
  * An action that populates a principal name obtained from a lookup function into a {@link SubjectContext}
  * child of the {@link ProfileRequestContext}.
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 739acac..12d5739 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.profile.impl;
 
 import java.io.IOException;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +41,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.webflow.execution.RequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Action that refreshes a {@link ReloadableService} manually.
  * 
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
index 3e38c07..5bfe708 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.profile.impl;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -50,9 +51,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that invokes the {@link AttributeResolver} for the current request.
  * 
@@ -112,15 +110,15 @@ public final class ResolveAttributes extends AbstractProfileAction {
         issuerLookupStrategy = new ResponderIdLookupFunction();
         recipientLookupStrategy = new RelyingPartyIdLookupFunction();
         
-        principalNameLookupStrategy = Functions.compose(
-                new SubjectContextPrincipalLookupFunction(),
-                new ChildContextLookup<ProfileRequestContext,SubjectContext>(SubjectContext.class));
+        principalNameLookupStrategy =
+                new SubjectContextPrincipalLookupFunction().compose(
+                        new ChildContextLookup<>(SubjectContext.class));
         
         authnContextLookupStrategy = new ChildContextLookup<>(AuthenticationContext.class);
         
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeContext.
-        attributeContextCreationStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class, true),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextCreationStrategy = new ChildContextLookup<>(AttributeContext.class, true).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
         
         attributesLookupStrategy = FunctionSupport.<ProfileRequestContext,Collection<String>>constant(
                 Collections.<String>emptyList());
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestPrincipalLookup.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestPrincipalLookup.java
index 77b6b7b..a1c0512 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestPrincipalLookup.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestPrincipalLookup.java
@@ -17,19 +17,18 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-
 /**
  * Returns the principal name from a {@link ResolverTestRequest} message in the inbound message context.
  */
 public class ResolverTestPrincipalLookup implements Function<ProfileRequestContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         
         if (input != null && input.getInboundMessageContext() != null) {
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectProfileConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectProfileConfiguration.java
index bbbbf80..6797650 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectProfileConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectProfileConfiguration.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -35,8 +37,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that selects the {@link ProfileConfiguration} for the given request and sets it in the looked-up
  * {@link RelyingPartyContext}.
@@ -118,7 +118,7 @@ public class SelectProfileConfiguration extends AbstractProfileAction {
                     new Object[] {getLogPrefix(), profileId, rpConfig.getId(), rpCtx.getRelyingPartyId(),});
             ActionSupport.buildEvent(profileRequestContext, IdPEventIds.INVALID_PROFILE_CONFIG);
         } else if (profileConfiguration instanceof ConditionalProfileConfiguration
-                && !((ConditionalProfileConfiguration) profileConfiguration).getActivationCondition().apply(
+                && !((ConditionalProfileConfiguration) profileConfiguration).getActivationCondition().test(
                         profileRequestContext)) {
             log.warn("{} Profile {} is not active for RP configuration {} (RPID {})",
                     new Object[] {getLogPrefix(), profileId, rpConfig.getId(), rpCtx.getRelyingPartyId(),});
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
index 22dea03..ef122cd 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -38,8 +40,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * This action attempts to resolve a {@link RelyingPartyConfiguration} and adds it to the {@link RelyingPartyContext}
  * that was looked up.
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/WebFlowMessageHandlerAdaptor.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/WebFlowMessageHandlerAdaptor.java
index 254cee2..d0ab4a0 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/WebFlowMessageHandlerAdaptor.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/WebFlowMessageHandlerAdaptor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -35,8 +37,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An {@link AbstractProfileAction} subclass that adapts an OpenSAML {@link MessageHandler} for execution 
  * in a Spring WebFlow environment.
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
index a1800a8..0474838 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.profile.interceptor.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -38,9 +39,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
@@ -115,12 +114,8 @@ public class PopulateProfileInterceptorContext extends AbstractProfileIntercepto
         if (activeFlows != null) {
             for (final String id : activeFlows) {
                 final String flowId = ProfileInterceptorFlowDescriptor.FLOW_ID_PREFIX + id;
-                final Optional<ProfileInterceptorFlowDescriptor> flow = Iterables.tryFind(availableFlows,
-                        new Predicate<ProfileInterceptorFlowDescriptor>() {
-                            public boolean apply(final ProfileInterceptorFlowDescriptor input) {
-                                return input.getId().equals(flowId);
-                            }
-                });
+                final Optional<ProfileInterceptorFlowDescriptor> flow =
+                        Iterables.tryFind(availableFlows, fd -> fd.getId().equals(flowId));
                 
                 if (flow.isPresent()) {
                     log.debug("{} Installing flow {} into interceptor context", getLogPrefix(), flowId);
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/SelectProfileInterceptorFlow.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/SelectProfileInterceptorFlow.java
index 07015e7..fe93437 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/SelectProfileInterceptorFlow.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/SelectProfileInterceptorFlow.java
@@ -99,7 +99,7 @@ public class SelectProfileInterceptorFlow extends AbstractProfileInterceptorActi
 
         for (final ProfileInterceptorFlowDescriptor flow : interceptorContext.getAvailableFlows().values()) {
             log.debug("{} Checking flow {} for applicability...", getLogPrefix(), flow.getId());
-            if (flow.apply(profileRequestContext)) {
+            if (flow.test(profileRequestContext)) {
                 interceptorContext.setAttemptedFlow(flow);
                 return flow;
             }
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 3c1f874..77dabec 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.messaging.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -29,9 +31,6 @@ import org.opensaml.messaging.handler.MessageHandlerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 import net.shibboleth.idp.profile.config.ProfileConfiguration;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
@@ -67,10 +66,9 @@ public class SelectProfileConfiguration extends AbstractMessageHandler {
     
     /** Constructor. */
     public SelectProfileConfiguration() {
-        relyingPartyContextLookupStrategy =   Functions.compose(
-                new ChildContextLookup<InOutOperationContext, RelyingPartyContext>(RelyingPartyContext.class),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
+        relyingPartyContextLookupStrategy =
+                new ChildContextLookup<>(RelyingPartyContext.class).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
     }
 
     /**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectRelyingPartyConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectRelyingPartyConfiguration.java
index 9ec18c7..6d2bb82 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectRelyingPartyConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/messaging/impl/SelectRelyingPartyConfiguration.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.messaging.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -30,9 +32,6 @@ import org.opensaml.messaging.handler.MessageHandlerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.relyingparty.CriteriaRelyingPartyConfigurationResolver;
 import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
@@ -69,10 +68,9 @@ public final class SelectRelyingPartyConfiguration extends AbstractMessageHandle
     
     /** Constructor. */
     public SelectRelyingPartyConfiguration() {
-        relyingPartyContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<InOutOperationContext, RelyingPartyContext>(RelyingPartyContext.class),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
+        relyingPartyContextLookupStrategy =
+                new ChildContextLookup<>(RelyingPartyContext.class).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
     }
 
     /**
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 d63a0f7..b9ed1cf 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
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -48,7 +49,6 @@ import org.opensaml.security.credential.Credential;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
@@ -250,7 +250,7 @@ public class DefaultRelyingPartyConfigurationResolver
         }
 
         log.debug("Resolving relying party configuration");
-        if (!verificationPredicate.apply(context)) {
+        if (!verificationPredicate.test(context)) {
             if (getUnverifiedConfiguration() == null) {
                 log.warn("Profile request was unverified, but no such configuration is available");
                 return Collections.emptyList();
@@ -264,7 +264,7 @@ public class DefaultRelyingPartyConfigurationResolver
 
         for (final RelyingPartyConfiguration configuration : rpConfigurations) {
             log.debug("Checking if relying party configuration {} is applicable", configuration.getId());
-            if (configuration.apply(context)) {
+            if (configuration.test(context)) {
                 log.debug("Relying party configuration {} is applicable", configuration.getId());
                 matches.add(configuration);
             } else {
@@ -290,7 +290,7 @@ public class DefaultRelyingPartyConfigurationResolver
         }
         
         log.debug("Resolving relying party configuration");
-        if (!verificationPredicate.apply(context)) {
+        if (!verificationPredicate.test(context)) {
             if (getUnverifiedConfiguration() == null) {
                 log.warn("Profile request was unverified, but no such configuration is available");
                 return null;
@@ -302,7 +302,7 @@ public class DefaultRelyingPartyConfigurationResolver
 
         for (final RelyingPartyConfiguration configuration : rpConfigurations) {
             log.debug("Checking if relying party configuration {} is applicable", configuration.getId());
-            if (configuration.apply(context)) {
+            if (configuration.test(context)) {
                 log.debug("Relying party configuration {} is applicable", configuration.getId());
                 return configuration;
             } else {
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContextTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContextTest.java
index 71b20f1..c6fb041 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContextTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/PopulateAuditContextTest.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import net.shibboleth.idp.profile.ActionTestingSupport;
 
@@ -38,8 +39,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** {@link PopulateAuditContext} unit test. */
 public class PopulateAuditContextTest {
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AbstractRelyingPartyParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AbstractRelyingPartyParser.java
index 7255934..bf57c2b 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AbstractRelyingPartyParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AbstractRelyingPartyParser.java
@@ -38,7 +38,7 @@ import org.w3c.dom.Element;
 /**
  * Parser for the common parts of <AnonymousRelyingParty> <DefaultRelyingParty> and <RelyingParty>.
  * Implementations only differ by being named or not (for reference elsewhere) and by the
- * {@link com.google.common.base.Predicate} which is injected.
+ * {@link java.util.function.Predicate} which is injected.
  */
 public abstract class AbstractRelyingPartyParser extends AbstractSingleBeanDefinitionParser {
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AnonymousRelyingPartyParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AnonymousRelyingPartyParser.java
index ee136fc..5277c8b 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AnonymousRelyingPartyParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/AnonymousRelyingPartyParser.java
@@ -27,7 +27,7 @@ import org.w3c.dom.Element;
 
 /**
  * Parser for the <rp:AnonymousRelyingParty> element. <br/>
- * The {@link com.google.common.base.Predicate} which is injected looks to see if there is metadata associated with the
+ * The {@link java.util.function.Predicate} which is injected looks to see if there is metadata associated with the
  * RelyingParty and if so says TRUE.
  */
 public class AnonymousRelyingPartyParser extends AbstractRelyingPartyParser {
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/DefaultRelyingPartyParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/DefaultRelyingPartyParser.java
index caf14ba..86ea149 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/DefaultRelyingPartyParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/DefaultRelyingPartyParser.java
@@ -29,7 +29,7 @@ import com.google.common.base.Predicates;
 
 /**
  * Parser for the <rp:AnonymousRelyingParty> element. <br/>
- * The {@link com.google.common.base.Predicate} which is injected is AlwaysTrue. The {@link RelyingPartyGroupParser}
+ * The {@link java.util.function.Predicate} which is injected is AlwaysTrue. The {@link RelyingPartyGroupParser}
  * takes care to ensure that this element is always at the end of the list, thus implementing Default semantics.
  */
 public class DefaultRelyingPartyParser extends AbstractRelyingPartyParser {
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/RelyingPartyParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/RelyingPartyParser.java
index a435d30..f8caad4 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/RelyingPartyParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/impl/RelyingPartyParser.java
@@ -24,6 +24,8 @@ import javax.xml.namespace.QName;
 import net.shibboleth.idp.profile.logic.RelyingPartyIdPredicate;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataProviderParser;
 import net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLookupFunction;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
+import net.shibboleth.utilities.java.support.logic.PredicateSupport;
 import net.shibboleth.utilities.java.support.logic.StrategyIndirectedPredicate;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
@@ -34,9 +36,6 @@ import org.springframework.beans.factory.support.ManagedList;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.w3c.dom.Element;
 
-import com.google.common.base.Functions;
-import com.google.common.base.Predicates;
-
 /**
  * Parser for the <rp:RelyingParty> element.
  */
@@ -49,7 +48,7 @@ public class RelyingPartyParser extends AbstractRelyingPartyParser {
      * {@inheritDoc} The construction of the activation Condition is more complicated than one might suppose. The
      * definition is that if the it matches the relyingPartyID *or* it matches the <EntitiesDescriptor>, then the
      * configuration matches. So we need to
-     * {@link Predicates#or(com.google.common.base.Predicate, com.google.common.base.Predicate)} a
+     * {@link PredicateSupport#or(java.util.function.Predicate, java.util.function.Predicate)} a
      * {@link RelyingPartyIdPredicate} and an {@link EntityGroupNamePredicate} These however may have injected lookup
      * strategies and so these need to be constructed as a BeanDefinition.
      * */
@@ -75,7 +74,7 @@ public class RelyingPartyParser extends AbstractRelyingPartyParser {
         
         // This is a lookup function composition to get from the PRC to the SAMLMetadataContext.
         final BeanDefinitionBuilder lookupFunction =
-                BeanDefinitionBuilder.rootBeanDefinition(Functions.class, "compose");
+                BeanDefinitionBuilder.rootBeanDefinition(FunctionSupport.class, "compose");
         lookupFunction.addConstructorArgValue(BeanDefinitionBuilder.genericBeanDefinition(
                 EntityDescriptorLookupFunction.class).getBeanDefinition());
         lookupFunction.addConstructorArgValue(BeanDefinitionBuilder.genericBeanDefinition(
@@ -87,7 +86,7 @@ public class RelyingPartyParser extends AbstractRelyingPartyParser {
         indirectPredicate.addConstructorArgValue(lookupFunction.getBeanDefinition());
         indirectPredicate.addConstructorArgValue(egPredicate.getBeanDefinition());
 
-        final BeanDefinitionBuilder orPredicate = BeanDefinitionBuilder.genericBeanDefinition(Predicates.class);
+        final BeanDefinitionBuilder orPredicate = BeanDefinitionBuilder.genericBeanDefinition(PredicateSupport.class);
         orPredicate.setFactoryMethod("or");
         orPredicate.addConstructorArgValue(rpPredicate.getBeanDefinition());
         orPredicate.addConstructorArgValue(indirectPredicate.getBeanDefinition());
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
index 4eeddd0..7b12965 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/impl/PredicateFilterParser.java
@@ -26,6 +26,7 @@ import javax.xml.namespace.QName;
 import net.shibboleth.ext.spring.util.SpringSupport;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataProviderParser;
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.ScriptTypeBeanParser;
+import net.shibboleth.utilities.java.support.logic.PredicateSupport;
 import net.shibboleth.utilities.java.support.logic.ScriptedPredicate;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.ElementSupport;
@@ -45,8 +46,6 @@ import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.w3c.dom.Element;
 
-import com.google.common.base.Predicates;
-
 /**
  * Parser for a <Predicate> filter.
  */
@@ -88,7 +87,7 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
 
 // Checkstyle: CyclomaticComplexity OFF
     /**
-     * Parser custom element content into a {@link com.google.common.base.Predicate} to pass to the filter constructor.
+     * Parser custom element content into a {@link java.util.function.Predicate} to pass to the filter constructor.
      * 
      * @param element root element to parse
      * 
@@ -129,7 +128,8 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
                 return scriptPredicateBuilder.getBeanDefinition();
             }
         } else {
-            final BeanDefinitionBuilder orBuilder = BeanDefinitionBuilder.rootBeanDefinition(Predicates.class, "or");
+            final BeanDefinitionBuilder orBuilder =
+                    BeanDefinitionBuilder.rootBeanDefinition(PredicateSupport.class, "or");
             final ManagedList<BeanDefinition> managedList = new ManagedList<>(count);
             if (entityIdPredicateBuilder != null) {
                 managedList.add(entityIdPredicateBuilder.getBeanDefinition());
@@ -248,7 +248,8 @@ public class PredicateFilterParser extends AbstractSingleBeanDefinitionParser {
         } else if (scriptList.size() == 1) {
             return ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, scriptList.get(0));
         } else {
-            final BeanDefinitionBuilder orBuilder = BeanDefinitionBuilder.rootBeanDefinition(Predicates.class, "or");
+            final BeanDefinitionBuilder orBuilder =
+                    BeanDefinitionBuilder.rootBeanDefinition(PredicateSupport.class, "or");
             final ManagedList<BeanDefinition> managedList = new ManagedList<>(scriptList.size());
             for (final Element e : scriptList) {
                 managedList.add(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, e).getBeanDefinition());
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/DynamicHTTPMetadataProviderParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/DynamicHTTPMetadataProviderParser.java
index e7fc3ea..327b83f 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/DynamicHTTPMetadataProviderParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/DynamicHTTPMetadataProviderParser.java
@@ -75,7 +75,7 @@ public class DynamicHTTPMetadataProviderParser extends AbstractDynamicHTTPMetada
     }
 
     /**
-     * Build and return an instance of the {@link com.google.common.base.Function} used as the request URL builder.
+     * Build and return an instance of the {@link java.util.function.Function} used as the request URL builder.
      * 
      * @param element the parent metadata provider element
      * @return the function
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
index 642568b..1ede21e 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/impl/MetadataResolverServiceStrategy.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -36,8 +37,6 @@ import org.opensaml.saml.metadata.resolver.MetadataResolver;
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.context.ApplicationContext;
 
-import com.google.common.base.Function;
-
 /**
  * Strategy for summoning up a {@link MetadataResolver} from a populated {@link ApplicationContext}. <br/>
  * This is made somewhat complex by the need to chain multiple, top level Metadata Resolvers, but to not combine, non
@@ -50,8 +49,7 @@ public class MetadataResolverServiceStrategy extends AbstractIdentifiableInitial
         Function<ApplicationContext, ServiceableComponent<MetadataResolver>> {
 
     /** {@inheritDoc} */
-    @Override @Nullable public ServiceableComponent<MetadataResolver>
-            apply(@Nullable final ApplicationContext appContext) {
+    @Nullable public ServiceableComponent<MetadataResolver> apply(@Nullable final ApplicationContext appContext) {
         final Collection<RelyingPartyMetadataProvider> resolvers =
                 appContext.getBeansOfType(RelyingPartyMetadataProvider.class).values();
 
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/AllowDelegationPredicateFactoryBean.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/AllowDelegationPredicateFactoryBean.java
index 2fcdd59..65ced19 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/AllowDelegationPredicateFactoryBean.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/AllowDelegationPredicateFactoryBean.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.profile.spring.relyingparty.saml.impl;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -24,7 +26,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.FactoryBean;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/BaseSAMLProfileConfigurationParser.java b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/BaseSAMLProfileConfigurationParser.java
index 61de14b..0c506f5 100644
--- a/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/BaseSAMLProfileConfigurationParser.java
+++ b/idp-profile-spring/src/main/java/net/shibboleth/idp/profile/spring/relyingparty/saml/impl/BaseSAMLProfileConfigurationParser.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.profile.spring.relyingparty.saml.impl;
 
 import java.util.List;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +41,6 @@ import org.springframework.beans.factory.xml.ParserContext;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import com.google.common.base.Predicate;
-
 /**
  * Parser for all classes which extend {@link net.shibboleth.idp.saml.profile.config.AbstractSAMLProfileConfiguration}
  * and for elements which inherit from <code>saml:SAMLProfileConfigutationType</code>.
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/DummyPredicate.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/DummyPredicate.java
index f12b34c..175b944 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/DummyPredicate.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/logic/DummyPredicate.java
@@ -17,19 +17,19 @@
 
 package net.shibboleth.idp.profile.spring.logic;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  *
  */
 public class DummyPredicate implements Predicate<ProfileRequestContext> {
 
     /** {@inheritDoc} */
-    public boolean apply(@Nullable ProfileRequestContext input) {
+    public boolean test(@Nullable ProfileRequestContext input) {
         return false;
     }
 
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyGroupTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyGroupTest.java
index 0d319bf..8ba4cfe 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyGroupTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyGroupTest.java
@@ -141,7 +141,7 @@ public class RelyingPartyGroupTest extends OpenSAMLInitBaseTestCase {
         Assert.assertTrue(resolver.getRelyingPartyConfigurations().isEmpty());
 
         final RelyingPartyConfiguration anon = resolver.getUnverifiedConfiguration();
-        Assert.assertFalse(anon.getDetailedErrorsPredicate().apply(null));
+        Assert.assertFalse(anon.getDetailedErrorsPredicate().test(null));
         Assert.assertTrue(anon.getProfileConfigurations().isEmpty());
 
         final RelyingPartyConfiguration def = resolver.getDefaultConfiguration();
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyTest.java
index b476089..4468c3f 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/RelyingPartyTest.java
@@ -67,14 +67,14 @@ public class RelyingPartyTest extends OpenSAMLInitBaseTestCase {
             final RelyingPartyConfiguration rpConf = context.getBean(RelyingPartyConfiguration.class);
     
             Assert.assertEquals(rpConf.getId(), "the_RP");
-            Assert.assertTrue(rpConf.getDetailedErrorsPredicate().apply(null));
+            Assert.assertTrue(rpConf.getDetailedErrorsPredicate().test(null));
             Assert.assertEquals(rpConf.getProfileConfigurations().size(), 1);
     
             final ProfileRequestContext ctx = new ProfileRequestContext<>();
             final RelyingPartyContext rpCtx = ctx.getSubcontext(RelyingPartyContext.class, true);
             rpCtx.setRelyingPartyId("the_RP");
             
-            Assert.assertTrue(rpConf.apply(ctx));
+            Assert.assertTrue(rpConf.test(ctx));
             //
             // TODO the EntitiesGroup thing
             //
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
index db4c485..f85f15b 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/DynamicHTTPMetadataProviderParserTest.java
@@ -21,6 +21,8 @@ import java.security.MessageDigest;
 import java.security.SecureRandom;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import net.shibboleth.idp.saml.metadata.RelyingPartyMetadataProvider;
 import net.shibboleth.utilities.java.support.repository.RepositorySupport;
@@ -42,9 +44,6 @@ import org.springframework.mock.env.MockPropertySource;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParserTest {
     
     private static final String PROP_MDURL = "metadataURL";
@@ -87,7 +86,7 @@ public class DynamicHTTPMetadataProviderParserTest extends AbstractMetadataParse
         Assert.assertTrue(resolver.getPersistentCacheKeyGenerator() instanceof AbstractDynamicMetadataResolver.DefaultCacheKeyGenerator);
         
         Assert.assertNotNull(resolver.getInitializationFromCachePredicate());
-        Assert.assertTrue(resolver.getInitializationFromCachePredicate().apply(null));  // always true predicate
+        Assert.assertTrue(resolver.getInitializationFromCachePredicate().test(null));  // always true predicate
         
         Assert.assertTrue(resolver.isInitializeFromPersistentCacheInBackground());
         
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
index d64bc51..9673921 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/LocalDynamicMetadataProviderParserTest.java
@@ -92,7 +92,7 @@ public class LocalDynamicMetadataProviderParserTest extends AbstractMetadataPars
         Assert.assertTrue(resolver.getPersistentCacheKeyGenerator() instanceof AbstractDynamicMetadataResolver.DefaultCacheKeyGenerator);
         
         Assert.assertNotNull(resolver.getInitializationFromCachePredicate());
-        Assert.assertTrue(resolver.getInitializationFromCachePredicate().apply(null));  // always true predicate
+        Assert.assertTrue(resolver.getInitializationFromCachePredicate().test(null));  // always true predicate
         
         Assert.assertTrue(resolver.isInitializeFromPersistentCacheInBackground());
         
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ReloadServiceConfigurationTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ReloadServiceConfigurationTest.java
index 4753eed..3dcedfa 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ReloadServiceConfigurationTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/ReloadServiceConfigurationTest.java
@@ -26,11 +26,11 @@ import net.shibboleth.idp.profile.RequestContextBuilder;
 import net.shibboleth.idp.profile.impl.ReloadServiceConfiguration;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 import net.shibboleth.utilities.java.support.service.ReloadableService;
 
 import org.joda.time.DateTime;
 import org.opensaml.profile.action.EventIds;
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.metadata.resolver.RefreshableMetadataResolver;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.webflow.execution.Event;
@@ -41,8 +41,6 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 public class ReloadServiceConfigurationTest extends AbstractMetadataParserTest {
 
     /** the service. */
@@ -79,11 +77,7 @@ public class ReloadServiceConfigurationTest extends AbstractMetadataParserTest {
         
         final ReloadServiceConfiguration action = new ReloadServiceConfiguration();
         action.setHttpServletResponse(response);
-        action.setServiceLookupStrategy(new Function<ProfileRequestContext,ReloadableService>() {
-            public ReloadableService apply(ProfileRequestContext input) {
-                return null;
-            }
-        });
+        action.setServiceLookupStrategy(FunctionSupport.constant(null));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -99,11 +93,7 @@ public class ReloadServiceConfigurationTest extends AbstractMetadataParserTest {
         
         final ReloadServiceConfiguration action = new ReloadServiceConfiguration();
         action.setHttpServletResponse(response);
-        action.setServiceLookupStrategy(new Function<ProfileRequestContext,ReloadableService>() {
-            public ReloadableService apply(ProfileRequestContext input) {
-                return service;
-            }
-        });
+        action.setServiceLookupStrategy(FunctionSupport.constant(service));
         action.initialize();
 
         final Event event = action.execute(src);
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
index 2e75dfb..0698987 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/metadata/filter/PredicateFilterParserTest.java
@@ -33,8 +33,6 @@ import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicates;
-
 import net.shibboleth.idp.profile.spring.relyingparty.metadata.AbstractMetadataParserTest;
 import net.shibboleth.utilities.java.support.logic.ScriptedPredicate;
 import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
@@ -107,7 +105,7 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
         Assert.assertEquals(filter.getDirection(), Direction.INCLUDE);
         
         Assert.assertTrue(filter.getCondition() instanceof ScriptedPredicate);
-        Assert.assertTrue(filter.getCondition().apply(null));
+        Assert.assertTrue(filter.getCondition().test(null));
     }
 
     @Test
@@ -115,8 +113,7 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
         final PredicateFilter filter = getBean(PredicateFilter.class, "filter/predicateScriptOr.xml");
         Assert.assertNotNull(filter);
         Assert.assertEquals(filter.getDirection(), Direction.INCLUDE);
-        Assert.assertSame(filter.getCondition().getClass(), Predicates.or(Predicates.alwaysTrue()).getClass());
-        Assert.assertTrue(filter.getCondition().apply(null));
+        Assert.assertTrue(filter.getCondition().test(null));
     }
 
     @Test
@@ -125,7 +122,7 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
         Assert.assertNotNull(filter);
         Assert.assertEquals(filter.getDirection(), Direction.EXCLUDE);
         Assert.assertNotNull(filter.getCondition());
-        Assert.assertSame(filter.getCondition().getClass(), Predicates.or(Predicates.alwaysTrue()).getClass());
+        Assert.assertFalse(filter.getCondition().test(null));
     }
 
     @Test
@@ -136,6 +133,6 @@ public class PredicateFilterParserTest extends AbstractMetadataParserTest {
         // hack!
         MetadataResolver resolver = getBean(MetadataResolver.class, "filter/entityTrueResolver.xml");
         Iterable<EntityDescriptor> entities = resolver.resolve(new CriteriaSet(new EntityIdCriterion("https://sp.example.org/sp/TRUE")));
-        Assert.assertTrue(filter.getCondition().apply(entities.iterator().next()));
+        Assert.assertTrue(filter.getCondition().test(entities.iterator().next()));
     }
 }
\ No newline at end of file
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/BaseSAMLProfileTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/BaseSAMLProfileTest.java
index 73926ee..1f75338 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/BaseSAMLProfileTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/BaseSAMLProfileTest.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.profile.spring.relyingparty.saml;
 
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.function.Predicate;
 
 import net.shibboleth.ext.spring.config.DurationToLongConverter;
 import net.shibboleth.ext.spring.config.StringToIPRangeConverter;
@@ -36,8 +37,6 @@ import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.testng.Assert;
 
-import com.google.common.base.Predicate;
-
 public class BaseSAMLProfileTest extends OpenSAMLInitBaseTestCase {
 
     private static final String PATH = "/net/shibboleth/idp/profile/spring/relyingparty/";
@@ -78,11 +77,11 @@ public class BaseSAMLProfileTest extends OpenSAMLInitBaseTestCase {
     }
 
     protected static void assertTruePredicate(final Predicate<ProfileRequestContext> predicate) {
-        Assert.assertTrue(predicate.apply(null));
+        Assert.assertTrue(predicate.test(null));
     }
 
     protected static void assertFalsePredicate(final Predicate<ProfileRequestContext> predicate) {
-        Assert.assertFalse(predicate.apply(null));
+        Assert.assertFalse(predicate.test(null));
     }
 
     protected static void assertConditionalPredicate(final Predicate<ProfileRequestContext> predicate) {
@@ -92,11 +91,11 @@ public class BaseSAMLProfileTest extends OpenSAMLInitBaseTestCase {
 
             mc.setConfidentialityActive(true);
             mc.setIntegrityActive(true);
-            Assert.assertFalse(predicate.apply(prc));
+            Assert.assertFalse(predicate.test(prc));
 
             mc.setConfidentialityActive(false);
             mc.setIntegrityActive(false);
-            Assert.assertTrue(predicate.apply(prc));
+            Assert.assertTrue(predicate.test(prc));
         } catch (final ComponentInitializationException e) {
             Assert.fail("ComponentInitializationException");
         }
diff --git a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/SAML2SSOSProfileTest.java b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/SAML2SSOSProfileTest.java
index 3d2935b..f7263b8 100644
--- a/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/SAML2SSOSProfileTest.java
+++ b/idp-profile-spring/src/test/java/net/shibboleth/idp/profile/spring/relyingparty/saml/SAML2SSOSProfileTest.java
@@ -28,13 +28,13 @@ public class SAML2SSOSProfileTest extends BaseSAMLProfileTest {
 
         SSOSProfileConfiguration profile = getBean(SSOSProfileConfiguration.class, "saml/ssos.xml", "beans.xml");
 
-        Assert.assertFalse(profile.getDelegationPredicate().apply(null));
+        Assert.assertFalse(profile.getDelegationPredicate().test(null));
     }
 
     @Test public void values() {
         SSOSProfileConfiguration profile =
                 getBean(SSOSProfileConfiguration.class, "saml/ssosValues.xml", "beans.xml");
 
-        Assert.assertTrue(profile.getDelegationPredicate().apply(null));
+        Assert.assertTrue(profile.getDelegationPredicate().test(null));
     }
 }
\ No newline at end of file
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoder.java
index fb24963..188fd04 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoder.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoder.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.attribute.encoding;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.saml.nameid.SAML1NameIdentifierAttributeEncoder;
@@ -30,7 +32,6 @@ import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.Object
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoder.java
index 1b99f2a..f63bb20 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoder.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoder.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.attribute.encoding;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.saml.nameid.SAML2NameIDAttributeEncoder;
@@ -30,7 +32,6 @@ import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.Object
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.common.xml.SAMLConstants;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAMLAttributeEncoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAMLAttributeEncoder.java
index fbac945..1e7f36b 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAMLAttributeEncoder.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAMLAttributeEncoder.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.attribute.encoding;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,7 +45,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfiguration.java
index d40dfe2..e25e658 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfiguration.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.idwsf.profile.config;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration;
@@ -25,7 +27,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /** Configuration support for the Liberty ID-WSF SSOS profile. */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIdentifierAttributeEncoder.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIdentifierAttributeEncoder.java
index 76c7a5d..7e787f2 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIdentifierAttributeEncoder.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/nameid/NameIdentifierAttributeEncoder.java
@@ -19,9 +19,9 @@ package net.shibboleth.idp.saml.nameid;
 
 import net.shibboleth.idp.attribute.AttributeEncoder;
 
-import org.opensaml.saml.common.SAMLObject;
+import java.util.function.Predicate;
 
-import com.google.common.base.Predicate;
+import org.opensaml.saml.common.SAMLObject;
 
 /**
  * Marker interface for {@link AttributeEncoder} that produces SAML name identifiers
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 af5557e..520e372 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
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -42,8 +43,6 @@ import org.opensaml.soap.client.security.SOAPClientSecurityProfileIdLookupFuncti
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.collect.Collections2;
 
 import net.shibboleth.utilities.java.support.annotation.constraint.Live;
@@ -173,11 +172,7 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         Constraint.isNotNull(aliases, "Alias collection cannot be null");
         
         propertyAliases = Collections2.transform(StringSupport.normalizeStringCollection(aliases),
-                new Function<String,String>() {
-                    public String apply(final String input) {
-                        return input + (input.endsWith("/") ? propertyName : '/' + propertyName);
-                    }
-                });
+                s -> s + (s.endsWith("/") ? propertyName : '/' + propertyName));
     }
     
     /**
@@ -391,14 +386,14 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
     static {
         // Init PRC defaults.
         
-        DEFAULT_PRC_METADATA_LOOKUP = Functions.compose(new EntityDescriptorLookupFunction(),
+        DEFAULT_PRC_METADATA_LOOKUP = new EntityDescriptorLookupFunction().compose(
                 new net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLookupFunction());
         
         DEFAULT_PRC_PROFILE_ID_LOOKUP = new ProfileIdLookup();
 
         // Init MC defaults.
 
-        DEFAULT_MC_METADATA_LOOKUP = Functions.compose(new EntityDescriptorLookupFunction(),
+        DEFAULT_MC_METADATA_LOOKUP = new EntityDescriptorLookupFunction().compose(
                 new net.shibboleth.idp.saml.profile.context.navigate.messaging.SAMLMetadataContextLookupFunction());
         
         DEFAULT_MC_PROFILE_ID_LOOKUP = new SOAPClientSecurityProfileIdLookupFunction();
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractSAMLProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractSAMLProfileConfiguration.java
index ec9bc80..e535437 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractSAMLProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/AbstractSAMLProfileConfiguration.java
@@ -22,6 +22,8 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +42,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
 
@@ -177,7 +177,7 @@ public abstract class AbstractSAMLProfileConfiguration extends AbstractCondition
 
     /**{@inheritDoc} */
     @Override public boolean includeConditionsNotBefore() {
-        return includeNotBeforePredicate.apply(getProfileRequestContext());
+        return includeNotBeforePredicate.test(getProfileRequestContext());
     }
 
     /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLArtifactConsumerProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLArtifactConsumerProfileConfiguration.java
index 35a2cff..c7a8fd9 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLArtifactConsumerProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLArtifactConsumerProfileConfiguration.java
@@ -17,12 +17,12 @@
 
 package net.shibboleth.idp.saml.profile.config;
 
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 
 import org.opensaml.messaging.context.MessageContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Common interface for SAML profile configurations involving artifact consumption, for example artifact
  * resolution requests. 
@@ -43,5 +43,4 @@ public interface SAMLArtifactConsumerProfileConfiguration extends SAMLProfileCon
      */
     @Nonnull Predicate<MessageContext> getClientTLSArtifactRequests(); 
 
-    
 }
\ No newline at end of file
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLProfileConfiguration.java
index e97d89b..42f913d 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/SAMLProfileConfiguration.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.profile.config;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -29,8 +30,6 @@ import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
 import net.shibboleth.utilities.java.support.annotation.constraint.Positive;
 import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
 
-import com.google.common.base.Predicate;
-
 /** Common interface for SAML profile configurations. */
 public interface SAMLProfileConfiguration extends ProfileConfiguration {
 
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/AllowedSAMLPresentersPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/AllowedSAMLPresentersPredicate.java
index 8257796..0877d09 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/AllowedSAMLPresentersPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/AllowedSAMLPresentersPredicate.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.utilities.java.support.logic.Predicate;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -32,8 +33,6 @@ import org.opensaml.saml.common.messaging.context.SAMLPresenterEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 /**
  * Predicate which evaluates the inbound {@link SAMLPresenterEntityContext#getEntityId()}
  * against a specified collection of entityIDs.
@@ -41,7 +40,7 @@ import com.google.common.base.Predicate;
 public class AllowedSAMLPresentersPredicate implements Predicate<ProfileRequestContext> {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AllowedSAMLPresentersPredicate.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AllowedSAMLPresentersPredicate.class);
     
     /** The set of allowed presenters. */
     @Nonnull private Set<String> allowedPresenters;
@@ -65,7 +64,7 @@ public class AllowedSAMLPresentersPredicate implements Predicate<ProfileRequestC
     }
 
     /** {@inheritDoc} */
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input == null || input.getInboundMessageContext() == null) {
             log.debug("ProfileRequestContext or inbound MessageContext were null");
             return false;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/DetailedErrorsProfileConfigPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/DetailedErrorsProfileConfigPredicate.java
index 7cb5016..fe23269 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/DetailedErrorsProfileConfigPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/DetailedErrorsProfileConfigPredicate.java
@@ -35,11 +35,10 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class DetailedErrorsProfileConfigPredicate extends AbstractRelyingPartyPredicate {
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null && rpc.getConfiguration() != null) {
-            return rpc.getConfiguration().getDetailedErrorsPredicate().apply(input);
+            return rpc.getConfiguration().getDetailedErrorsPredicate().test(input);
         }
         
         return false;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ForceAuthnProfileConfigPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ForceAuthnProfileConfigPredicate.java
index b753c2e..ff97dce 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ForceAuthnProfileConfigPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ForceAuthnProfileConfigPredicate.java
@@ -36,19 +36,18 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class ForceAuthnProfileConfigPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getForceAuthnPredicate().apply(input);
+                        rpc.getProfileConfig()).getForceAuthnPredicate().test(input);
             } else if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getForceAuthnPredicate().apply(input);
+                        rpc.getProfileConfig()).getForceAuthnPredicate().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/IncludeAttributeStatementPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/IncludeAttributeStatementPredicate.java
index 96e2aed..1e1b441 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/IncludeAttributeStatementPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/IncludeAttributeStatementPredicate.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.config.logic;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -29,9 +31,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.context.navigate.OutboundMessageContextLookup;
 import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * A predicate that evaluates a SSO {@link ProfileRequestContext} and determines whether an attribute statement
  * should be included in the outgoing assertion.
@@ -47,7 +46,7 @@ public class IncludeAttributeStatementPredicate extends AbstractRelyingPartyPred
     
     /** Constructor. */
     public IncludeAttributeStatementPredicate() {
-        bindingContextLookupStrategy = Functions.compose(new ChildContextLookup<>(SAMLBindingContext.class),
+        bindingContextLookupStrategy = new ChildContextLookup<>(SAMLBindingContext.class).compose(
                 new OutboundMessageContextLookup());
     }
 
@@ -63,8 +62,7 @@ public class IncludeAttributeStatementPredicate extends AbstractRelyingPartyPred
     }
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         // Check for an artifact binding.
         final SAMLBindingContext bindingCtx = bindingContextLookupStrategy.apply(input);
@@ -78,11 +76,11 @@ public class IncludeAttributeStatementPredicate extends AbstractRelyingPartyPred
             if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getIncludeAttributeStatementPredicate().apply(input);
+                        rpc.getProfileConfig()).getIncludeAttributeStatementPredicate().test(input);
             } else if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getIncludeAttributeStatementPredicate().apply(input);
+                        rpc.getProfileConfig()).getIncludeAttributeStatementPredicate().test(input);
             } else if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml1.profile.config.AttributeQueryProfileConfiguration) {
                 return true;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacyEncryptionRequirementPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacyEncryptionRequirementPredicate.java
index 01b5932..217b609 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacyEncryptionRequirementPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacyEncryptionRequirementPredicate.java
@@ -67,7 +67,8 @@ public class LegacyEncryptionRequirementPredicate extends NoConfidentialityMessa
     }
 
     /** {@inheritDoc} */
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    @Override
+    public boolean test(@Nullable final ProfileRequestContext input) {
         switch (settingToApply) {
             case ALWAYS:
                 return true;
@@ -76,7 +77,7 @@ public class LegacyEncryptionRequirementPredicate extends NoConfidentialityMessa
                 return false;
                 
             case CONDITIONAL:
-                return super.apply(input);
+                return super.test(input);
                 
             default:
                 throw new IllegalArgumentException("Encryption requirement setting not one of the supported values");
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacySigningRequirementPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacySigningRequirementPredicate.java
index 0cc18bf..7f86c7e 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacySigningRequirementPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/LegacySigningRequirementPredicate.java
@@ -67,7 +67,8 @@ public class LegacySigningRequirementPredicate extends NoIntegrityMessageChannel
     }
 
     /** {@inheritDoc} */
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    @Override
+    public boolean test(@Nullable final ProfileRequestContext input) {
         switch (settingToApply) {
             case ALWAYS:
                 return true;
@@ -76,7 +77,7 @@ public class LegacySigningRequirementPredicate extends NoIntegrityMessageChannel
                 return false;
                 
             case CONDITIONAL:
-                return super.apply(input);
+                return super.test(input);
                 
             default:
                 throw new IllegalArgumentException("Signing requirement setting not one of the supported values");
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/NotBeforeProfileConfigPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/NotBeforeProfileConfigPredicate.java
index 9c26f4b..18a4cb2 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/NotBeforeProfileConfigPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/NotBeforeProfileConfigPredicate.java
@@ -36,8 +36,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class NotBeforeProfileConfigPredicate extends AbstractRelyingPartyPredicate {
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ResolveAttributesProfileConfigPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ResolveAttributesProfileConfigPredicate.java
index 1880aa8..9b940a9 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ResolveAttributesProfileConfigPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/ResolveAttributesProfileConfigPredicate.java
@@ -34,18 +34,17 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class ResolveAttributesProfileConfigPredicate extends AbstractRelyingPartyPredicate {
 
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml1.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getResolveAttributesPredicate().apply(input);
+                        rpc.getProfileConfig()).getResolveAttributesPredicate().test(input);
             } else if (rpc.getProfileConfig()
                     instanceof net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration) {
                 return ((net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration)
-                        rpc.getProfileConfig()).getResolveAttributesPredicate().apply(input);
+                        rpc.getProfileConfig()).getResolveAttributesPredicate().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignAssertionsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignAssertionsPredicate.java
index 85ed49e..1a10569 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignAssertionsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignAssertionsPredicate.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.config.logic;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -31,8 +33,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.common.messaging.context.SAMLMetadataContext;
 import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
 
-import com.google.common.base.Function;
-
 /** A predicate implementation that forwards to {@link SAMLProfileConfiguration#getSignAssertions()}. */
 public class SignAssertionsPredicate extends AbstractRelyingPartyPredicate {
 
@@ -69,8 +69,7 @@ public class SignAssertionsPredicate extends AbstractRelyingPartyPredicate {
     }
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         if (honorMetadata) {
             final SAMLMetadataContext metadataCtx = metadataContextLookupStrategy.apply(input);
@@ -87,7 +86,7 @@ public class SignAssertionsPredicate extends AbstractRelyingPartyPredicate {
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SAMLProfileConfiguration) {
-                return ((SAMLProfileConfiguration) pc).getSignAssertions().apply(input);
+                return ((SAMLProfileConfiguration) pc).getSignAssertions().test(input);
             }
         }
 
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignRequestsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignRequestsPredicate.java
index e4e9fb9..35a93a8 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignRequestsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignRequestsPredicate.java
@@ -30,13 +30,12 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class SignRequestsPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SAMLProfileConfiguration) {
-                return ((SAMLProfileConfiguration) pc).getSignRequests().apply(input);
+                return ((SAMLProfileConfiguration) pc).getSignRequests().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignResponsesPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignResponsesPredicate.java
index 13a654c..154e959 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignResponsesPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/SignResponsesPredicate.java
@@ -30,13 +30,12 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class SignResponsesPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SAMLProfileConfiguration) {
-                return ((SAMLProfileConfiguration) pc).getSignResponses().apply(input);
+                return ((SAMLProfileConfiguration) pc).getSignResponses().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSArtifactRequestsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSArtifactRequestsPredicate.java
index 388adc8..eee482f 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSArtifactRequestsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSArtifactRequestsPredicate.java
@@ -31,13 +31,12 @@ import net.shibboleth.idp.saml.profile.config.SAMLArtifactConsumerProfileConfigu
 public class ClientTLSArtifactRequestsPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final MessageContext input) {
+    public boolean test(@Nullable final MessageContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SAMLArtifactConsumerProfileConfiguration) {
-                return ((SAMLArtifactConsumerProfileConfiguration) pc).getClientTLSArtifactRequests().apply(input);
+                return ((SAMLArtifactConsumerProfileConfiguration) pc).getClientTLSArtifactRequests().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSSOAPLogoutRequestsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSSOAPLogoutRequestsPredicate.java
index 6c6a5be..18ec968 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSSOAPLogoutRequestsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/ClientTLSSOAPLogoutRequestsPredicate.java
@@ -31,13 +31,12 @@ import net.shibboleth.idp.saml.saml2.profile.config.SingleLogoutProfileConfigura
 public class ClientTLSSOAPLogoutRequestsPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final MessageContext input) {
+    public boolean test(@Nullable final MessageContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SingleLogoutProfileConfiguration) {
-                return ((SingleLogoutProfileConfiguration) pc).getClientTLSSOAPRequests().apply(input);
+                return ((SingleLogoutProfileConfiguration) pc).getClientTLSSOAPRequests().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignArtifactRequestsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignArtifactRequestsPredicate.java
index 3f2601d..5f25a4b 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignArtifactRequestsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignArtifactRequestsPredicate.java
@@ -31,13 +31,12 @@ import net.shibboleth.idp.saml.profile.config.SAMLArtifactConsumerProfileConfigu
 public class SignArtifactRequestsPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final MessageContext input) {
+    public boolean test(@Nullable final MessageContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SAMLArtifactConsumerProfileConfiguration) {
-                return ((SAMLArtifactConsumerProfileConfiguration) pc).getSignArtifactRequests().apply(input);
+                return ((SAMLArtifactConsumerProfileConfiguration) pc).getSignArtifactRequests().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignSOAPLogoutRequestsPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignSOAPLogoutRequestsPredicate.java
index 888a006..df819ed 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignSOAPLogoutRequestsPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/logic/messaging/SignSOAPLogoutRequestsPredicate.java
@@ -31,13 +31,12 @@ import net.shibboleth.idp.saml.saml2.profile.config.SingleLogoutProfileConfigura
 public class SignSOAPLogoutRequestsPredicate extends AbstractRelyingPartyPredicate {
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final MessageContext input) {
+    public boolean test(@Nullable final MessageContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
             if (pc != null && pc instanceof SingleLogoutProfileConfiguration) {
-                return ((SingleLogoutProfileConfiguration) pc).getSignSOAPRequests().apply(input);
+                return ((SingleLogoutProfileConfiguration) pc).getSignSOAPRequests().test(input);
             }
         }
         
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AssertionLifetimeLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AssertionLifetimeLookupFunction.java
index 162c160..9195c38 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AssertionLifetimeLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AssertionLifetimeLookupFunction.java
@@ -36,7 +36,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class AssertionLifetimeLookupFunction extends AbstractRelyingPartyLookupFunction<Long> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Long apply(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AudienceRestrictionsLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AudienceRestrictionsLookupFunction.java
index aff25b0..2c60b6f 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AudienceRestrictionsLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/AudienceRestrictionsLookupFunction.java
@@ -47,7 +47,6 @@ import com.google.common.collect.ImmutableList;
 public class AudienceRestrictionsLookupFunction extends AbstractRelyingPartyLookupFunction<Collection<String>> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable @NonnullElements @NotLive @Unmodifiable public Collection<String> apply(
             @Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyAudienceRestrictionsLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyAudienceRestrictionsLookupFunction.java
index 07d7c98..b3b96bf 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyAudienceRestrictionsLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyAudienceRestrictionsLookupFunction.java
@@ -45,7 +45,6 @@ import com.google.common.collect.ImmutableList;
 public class ProxyAudienceRestrictionsLookupFunction extends AbstractRelyingPartyLookupFunction<Collection<String>> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable @NonnullElements @NotLive @Unmodifiable public Collection<String> apply(
             @Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyCountLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyCountLookupFunction.java
index f26de80..a0a026c 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyCountLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/ProxyCountLookupFunction.java
@@ -37,7 +37,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class ProxyCountLookupFunction extends AbstractRelyingPartyLookupFunction<Long> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Long apply(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/QualifiedNameIDFormatsLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/QualifiedNameIDFormatsLookupFunction.java
index e9c5700..fca862a 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/QualifiedNameIDFormatsLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/QualifiedNameIDFormatsLookupFunction.java
@@ -48,7 +48,6 @@ import com.google.common.collect.ImmutableList;
 public class QualifiedNameIDFormatsLookupFunction extends AbstractRelyingPartyLookupFunction<Collection<String>> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable @NonnullElements @NotLive @Unmodifiable public Collection<String> apply(
             @Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/SessionLifetimeLookupFunction.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/SessionLifetimeLookupFunction.java
index f463cab..50813fb 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/SessionLifetimeLookupFunction.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/profile/config/navigate/SessionLifetimeLookupFunction.java
@@ -36,7 +36,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 public class SessionLifetimeLookupFunction extends AbstractRelyingPartyLookupFunction<Long> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Long apply(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
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 f3a1b2c..625687b 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
@@ -33,7 +33,6 @@ import org.opensaml.saml.common.messaging.context.SAMLMetadataContext;
 public class SAMLMetadataContextLookupFunction extends AbstractRelyingPartyLookupFunction<SAMLMetadataContext> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public SAMLMetadataContext apply(@Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpCtx = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpCtx != null) {
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 03ba6fd..31e81c8 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
@@ -33,7 +33,6 @@ import org.opensaml.saml.common.messaging.context.SAMLMetadataContext;
 public class SAMLMetadataContextLookupFunction extends AbstractRelyingPartyLookupFunction<SAMLMetadataContext> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public SAMLMetadataContext apply(@Nullable final MessageContext input) {
         final RelyingPartyContext rpCtx = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpCtx != null) {
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 2e7fe82..46b0bc5 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.profile.logic;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -38,8 +39,6 @@ import org.opensaml.saml.saml2.core.NameID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Function to filter a set of candidate NameIdentifier/NameID Format values derived from an entity's SAML metadata
  * against configuration preferences.
@@ -52,7 +51,7 @@ public class DefaultNameIdentifierFormatStrategy extends MetadataNameIdentifierF
     /**
      * Strategy used to locate the {@link RelyingPartyContext} associated with a given {@link ProfileRequestContext}.
      */
-    @Nonnull private Function<ProfileRequestContext, RelyingPartyContext> relyingPartyContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,RelyingPartyContext> relyingPartyContextLookupStrategy;
 
     /** Override the {@link ProfileConfiguration} to look for rather than whatever's populated. */
     @Nullable private String profileId;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/AbstractSAML1ArtifactAwareProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/AbstractSAML1ArtifactAwareProfileConfiguration.java
index aac28f2..9078c54 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/AbstractSAML1ArtifactAwareProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/AbstractSAML1ArtifactAwareProfileConfiguration.java
@@ -17,10 +17,11 @@
 
 package net.shibboleth.idp.saml.saml1.profile.config;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import org.opensaml.profile.context.ProfileRequestContext;
 
 import net.shibboleth.idp.saml.profile.config.AbstractSAMLProfileConfiguration;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/BrowserSSOProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/BrowserSSOProfileConfiguration.java
index 6474863..4f41e9d 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/BrowserSSOProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml1/profile/config/BrowserSSOProfileConfiguration.java
@@ -24,13 +24,12 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 import org.opensaml.profile.context.ProfileRequestContext;
 
 import com.google.common.base.Predicates;
@@ -120,7 +119,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML1ArtifactAwarePr
      * @deprecated Use {@link #getResolveAttributesPredicate()} instead.
      */
     public boolean resolveAttributes() {
-        return resolveAttributesPredicate.apply(getProfileRequestContext());
+        return resolveAttributesPredicate.test(getProfileRequestContext());
     }
     
     /**
@@ -165,7 +164,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML1ArtifactAwarePr
      * @deprecated Use {@link #getIncludeAttributeStatementPredicate()} instead.
      */
     public boolean includeAttributeStatement() {
-        return includeAttributeStatementPredicate.apply(getProfileRequestContext());
+        return includeAttributeStatementPredicate.test(getProfileRequestContext());
     }
 
     /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ArtifactAwareProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ArtifactAwareProfileConfiguration.java
index b42364e..e342ac2 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ArtifactAwareProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ArtifactAwareProfileConfiguration.java
@@ -17,13 +17,12 @@
 
 package net.shibboleth.idp.saml.saml2.profile.config;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.logic.NoIntegrityMessageChannelPredicate;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -63,7 +62,7 @@ public abstract class AbstractSAML2ArtifactAwareProfileConfiguration
     protected AbstractSAML2ArtifactAwareProfileConfiguration(@Nonnull @NotEmpty final String profileId) {
         super(profileId);
         signArtifactRequestsPredicate = new NoIntegrityMessageChannelPredicate();
-        clientTLSArtifactRequestsPredicate = Predicates.not(new NoIntegrityMessageChannelPredicate());
+        clientTLSArtifactRequestsPredicate = new NoIntegrityMessageChannelPredicate().negate();
     }
     
     /** {@inheritDoc} */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ProfileConfiguration.java
index de17581..6d91605 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/AbstractSAML2ProfileConfiguration.java
@@ -19,11 +19,12 @@ package net.shibboleth.idp.saml.saml2.profile.config;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.saml.profile.config.AbstractSAMLProfileConfiguration;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonNegative;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
@@ -33,7 +34,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 
@@ -139,7 +139,7 @@ public abstract class AbstractSAML2ProfileConfiguration extends AbstractSAMLProf
 
     /** {@inheritDoc} */
     @Override public boolean isEncryptionOptional() {
-        return encryptionOptionalPredicate.apply(getProfileRequestContext());
+        return encryptionOptionalPredicate.test(getProfileRequestContext());
     }
     
     /**
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfiguration.java
index 541227e..734938c 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfiguration.java
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -41,8 +43,6 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
@@ -153,7 +153,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML2ArtifactAwarePr
      */
     @Deprecated
     public boolean resolveAttributes() {
-        return resolveAttributesPredicate.apply(getProfileRequestContext());
+        return resolveAttributesPredicate.test(getProfileRequestContext());
     }
     
     /**
@@ -199,7 +199,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML2ArtifactAwarePr
      */
     @Deprecated
     public boolean includeAttributeStatement() {
-        return includeAttributeStatementPredicate.apply(getProfileRequestContext());
+        return includeAttributeStatementPredicate.test(getProfileRequestContext());
     }
 
     /**
@@ -280,7 +280,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML2ArtifactAwarePr
      */
     @Deprecated
     public boolean skipEndpointValidationWhenSigned() {
-        return skipEndpointValidationWhenSignedPredicate.apply(getProfileRequestContext());
+        return skipEndpointValidationWhenSignedPredicate.test(getProfileRequestContext());
     }
 
     /**
@@ -362,7 +362,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML2ArtifactAwarePr
      */
     @Deprecated
     public Boolean getAllowingDelegation() {
-        return allowDelegationPredicate.apply(getProfileRequestContext());
+        return allowDelegationPredicate.test(getProfileRequestContext());
     }
 
     /**
@@ -386,7 +386,7 @@ public class BrowserSSOProfileConfiguration extends AbstractSAML2ArtifactAwarePr
      * @return whether produced assertions may be delegated
      */
     public boolean isAllowingDelegation() {
-        return allowDelegationPredicate.apply(getProfileRequestContext());
+        return allowDelegationPredicate.test(getProfileRequestContext());
     }
     
     
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/ECPProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/ECPProfileConfiguration.java
index 8caf821..7de5504 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/ECPProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/ECPProfileConfiguration.java
@@ -21,13 +21,13 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableSet;
 
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SAML2ProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SAML2ProfileConfiguration.java
index 1cde8d5..2164fc9 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SAML2ProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SAML2ProfileConfiguration.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.saml2.profile.config;
 
 import java.util.Collection;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -28,8 +29,6 @@ import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Predicate;
-
 /**
  * Base interface for SAML 2 profile configurations. 
  */
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
index fe4c7f5..6248c0d 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
@@ -19,6 +19,8 @@ package net.shibboleth.idp.saml.saml2.profile.config;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -28,13 +30,11 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.logic.NoConfidentialityMessageChannelPredicate;
 import org.opensaml.profile.logic.NoIntegrityMessageChannelPredicate;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
@@ -73,8 +73,7 @@ public class SingleLogoutProfileConfiguration extends AbstractSAML2ArtifactAware
         setEncryptNameIDs(new NoConfidentialityMessageChannelPredicate());
 
         signSOAPRequestsPredicate = new org.opensaml.messaging.logic.NoIntegrityMessageChannelPredicate();
-        clientTLSSOAPRequestsPredicate =
-                Predicates.not(new org.opensaml.messaging.logic.NoIntegrityMessageChannelPredicate());
+        clientTLSSOAPRequestsPredicate = new org.opensaml.messaging.logic.NoIntegrityMessageChannelPredicate().negate();
         
         qualifiedNameIDFormats = Collections.emptyList();
     }
@@ -138,7 +137,7 @@ public class SingleLogoutProfileConfiguration extends AbstractSAML2ArtifactAware
      * 
      * @since 3.4.0
      */
-    public Collection<String> getQualifiedNameIDFormats() {
+    @Nonnull @NonnullElements @NotLive public Collection<String> getQualifiedNameIDFormats() {
         return ImmutableList.copyOf(getIndirectProperty(qualifiedNameIDFormatsLookupStrategy, qualifiedNameIDFormats));
     }
 
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 59f863a..e005456 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.config.logic;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -32,8 +34,6 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Predicate that decides whether to handle an error by returning a SOAP fault to a requester
  * or fail locally.
@@ -65,8 +65,7 @@ public class SOAPErrorPredicate extends AbstractRelyingPartyPredicate {
     }
     
     /** {@inheritDoc} */
-    @Override
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         
         final RelyingPartyContext rpCtx = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpCtx == null) {
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/IssuingDelegatedAssertionPredicate.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/IssuingDelegatedAssertionPredicate.java
index d7180bf..be4a819 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/IssuingDelegatedAssertionPredicate.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/IssuingDelegatedAssertionPredicate.java
@@ -17,17 +17,17 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.logic.Predicate;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * A predicate which determines whether issuance of a delegated 
  * SAML 2 {@link org.opensaml.saml.saml2.core.Assertion} is active.
@@ -54,7 +54,7 @@ public class IssuingDelegatedAssertionPredicate implements Predicate<ProfileRequ
     }
     
     /** {@inheritDoc} */
-    public boolean apply(@Nullable final ProfileRequestContext input) {
+    public boolean test(@Nullable final ProfileRequestContext input) {
         if (input == null) {
             return false;
         }
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoderTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoderTest.java
index 54a6f19..070a411 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoderTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML1NameIdentifierEncoderTest.java
@@ -36,7 +36,7 @@ public class AbstractSAML1NameIdentifierEncoderTest {
                 return null;
             }
 
-            public boolean apply(String input) {
+            public boolean test(String input) {
                 return false;
             }
         };
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoderTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoderTest.java
index bec6875..0142313 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoderTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/attribute/encoding/AbstractSAML2NameIDEncoderTest.java
@@ -45,7 +45,7 @@ public class AbstractSAML2NameIDEncoderTest {
                 return null;
             }
 
-            public boolean apply(String input) {
+            public boolean test(String input) {
                 return false;
             }
         };
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfigurationTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfigurationTest.java
index 8472b3d..709d043 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfigurationTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/idwsf/profile/config/SSOSProfileConfigurationTest.java
@@ -42,11 +42,11 @@ public class SSOSProfileConfigurationTest {
         
         SSOSProfileConfiguration config = new SSOSProfileConfiguration();
         Assert.assertNotNull(config.getDelegationPredicate());
-        Assert.assertFalse(config.getDelegationPredicate().apply(prc));
+        Assert.assertFalse(config.getDelegationPredicate().test(prc));
         
         config.setDelegationPredicate(Predicates.<ProfileRequestContext>alwaysTrue());
         Assert.assertNotNull(config.getDelegationPredicate());
-        Assert.assertTrue(config.getDelegationPredicate().apply(prc));
+        Assert.assertTrue(config.getDelegationPredicate().test(prc));
         
     }
     
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml1/profile/SAML1ActionSupportTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml1/profile/SAML1ActionSupportTest.java
index 0ce77f9..e268919 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml1/profile/SAML1ActionSupportTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml1/profile/SAML1ActionSupportTest.java
@@ -22,6 +22,8 @@ import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.profile.ActionTestSupportAction;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
+import java.util.function.Function;
+
 import org.opensaml.core.OpenSAMLInitBaseTestCase;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -33,8 +35,6 @@ import org.springframework.webflow.execution.RequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /**
  * {@link SAML1ActionSupport} unit test.
  */
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/SAML2ActionSupportTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/SAML2ActionSupportTest.java
index 9dfecd6..3854873 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/SAML2ActionSupportTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/SAML2ActionSupportTest.java
@@ -22,6 +22,8 @@ import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.profile.ActionTestSupportAction;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
+import java.util.function.Function;
+
 import org.opensaml.core.OpenSAMLInitBaseTestCase;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -33,8 +35,6 @@ import org.springframework.webflow.execution.RequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /**
  * {@link SAML2ActionSupport} unit test.
  */
diff --git a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfigurationTest.java b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfigurationTest.java
index e5cf722..58146a3 100644
--- a/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfigurationTest.java
+++ b/idp-saml-api/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/BrowserSSOProfileConfigurationTest.java
@@ -28,13 +28,13 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /** Unit test for {@link BrowserSSOProfileConfiguration}. */
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML1StringNameIdentifierEncoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML1StringNameIdentifierEncoder.java
index 3ca3631..85d4d11 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML1StringNameIdentifierEncoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML1StringNameIdentifierEncoder.java
@@ -112,7 +112,7 @@ public class SAML1StringNameIdentifierEncoder extends AbstractSAML1NameIdentifie
 
     /** {@inheritDoc} */
     @Override
-    public boolean apply(@Nullable final String input) {
+    public boolean test(@Nullable final String input) {
         return SAML1ObjectSupport.areNameIdentifierFormatsEquivalent(input, format);
     }
     
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML2StringNameIDEncoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML2StringNameIDEncoder.java
index 64adc26..8f76845 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML2StringNameIDEncoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/encoding/impl/SAML2StringNameIDEncoder.java
@@ -112,7 +112,7 @@ public class SAML2StringNameIDEncoder extends AbstractSAML2NameIDEncoder {
 
     /** {@inheritDoc} */
     @Override
-    public boolean apply(final String input) {
+    public boolean test(final String input) {
         return SAML2ObjectSupport.areNameIDFormatsEquivalent(input, format);
     }
 
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionIDAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionIDAuditExtractor.java
index 24cb4bf..dc557fc 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionIDAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionIDAuditExtractor.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.audit.impl;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -28,7 +29,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -49,7 +49,6 @@ public class AssertionIDAuditExtractor implements Function<ProfileRequestContext
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         SAMLObject message = responseLookupStrategy.apply(input);
         if (message != null) {
@@ -64,12 +63,7 @@ public class AssertionIDAuditExtractor implements Function<ProfileRequestContext
                 final List<org.opensaml.saml.saml2.core.Assertion> assertions =
                         ((org.opensaml.saml.saml2.core.Response) message).getAssertions();
                 if (!assertions.isEmpty()) {
-                    return Collections2.transform(assertions,
-                            new Function<org.opensaml.saml.saml2.core.Assertion,String>() {
-                                    public String apply(final org.opensaml.saml.saml2.core.Assertion input) {
-                                        return input.getID();
-                                    }
-                                });
+                    return Collections2.transform(assertions, org.opensaml.saml.saml2.core.Assertion::getID);
                 }
                 
             } else if (message instanceof org.opensaml.saml.saml1.core.Response) {
@@ -77,12 +71,7 @@ public class AssertionIDAuditExtractor implements Function<ProfileRequestContext
                 final List<org.opensaml.saml.saml1.core.Assertion> assertions =
                         ((org.opensaml.saml.saml1.core.Response) message).getAssertions();
                 if (!assertions.isEmpty()) {
-                    return Collections2.transform(assertions,
-                            new Function<org.opensaml.saml.saml1.core.Assertion,String>() {
-                                    public String apply(final org.opensaml.saml.saml1.core.Assertion input) {
-                                        return input.getID();
-                                    }
-                                });
+                    return Collections2.transform(assertions, org.opensaml.saml.saml1.core.Assertion::getID);
                 }
                 
             } else if (message instanceof org.opensaml.saml.saml2.core.Assertion) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionInstantAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionInstantAuditExtractor.java
index 847350a..73105f1 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionInstantAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AssertionInstantAuditExtractor.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.audit.impl;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,7 +30,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -65,12 +65,7 @@ public class AssertionInstantAuditExtractor implements Function<ProfileRequestCo
                 final List<org.opensaml.saml.saml2.core.Assertion> assertions =
                         ((org.opensaml.saml.saml2.core.Response) message).getAssertions();
                 if (!assertions.isEmpty()) {
-                    return Collections2.transform(assertions,
-                            new Function<org.opensaml.saml.saml2.core.Assertion,DateTime>() {
-                                    public DateTime apply(final org.opensaml.saml.saml2.core.Assertion input) {
-                                        return input.getIssueInstant();
-                                    }
-                                });
+                    return Collections2.transform(assertions, org.opensaml.saml.saml2.core.Assertion::getIssueInstant);
                 }
                 
             } else if (message instanceof org.opensaml.saml.saml1.core.Response) {
@@ -78,12 +73,7 @@ public class AssertionInstantAuditExtractor implements Function<ProfileRequestCo
                 final List<org.opensaml.saml.saml1.core.Assertion> assertions =
                         ((org.opensaml.saml.saml1.core.Response) message).getAssertions();
                 if (!assertions.isEmpty()) {
-                    return Collections2.transform(assertions,
-                            new Function<org.opensaml.saml.saml1.core.Assertion,DateTime>() {
-                                    public DateTime apply(final org.opensaml.saml.saml1.core.Assertion input) {
-                                        return input.getIssueInstant();
-                                    }
-                                });
+                    return Collections2.transform(assertions, org.opensaml.saml.saml1.core.Assertion::getIssueInstant);
                 }
                 
             } else if (message instanceof org.opensaml.saml.saml2.core.Assertion) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnContextAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnContextAuditExtractor.java
index c10f354..e0bb104 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnContextAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnContextAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -27,8 +29,6 @@ import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.AuthnContext;
 import org.opensaml.saml.saml2.core.AuthnStatement;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /**
@@ -51,7 +51,6 @@ public class AuthnContextAuditExtractor implements Function<ProfileRequestContex
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         SAMLObject response = responseLookupStrategy.apply(input);
         if (response != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnInstantAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnInstantAuditExtractor.java
index 7206f6d..c188755 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnInstantAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/AuthnInstantAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -27,8 +29,6 @@ import org.opensaml.saml.saml1.core.AuthenticationStatement;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.AuthnStatement;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the first authentication timestamp from an assertions in a response. */
@@ -48,7 +48,6 @@ public class AuthnInstantAuditExtractor implements Function<ProfileRequestContex
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public DateTime apply(@Nullable final ProfileRequestContext input) {
         SAMLObject response = responseLookupStrategy.apply(input);
         if (response != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/ForceAuthnAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/ForceAuthnAuditExtractor.java
index bea5af5..2c9319e 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/ForceAuthnAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/ForceAuthnAuditExtractor.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the ForceAuthn attribute from an {@link AuthnRequest}. */
@@ -43,7 +43,6 @@ public class ForceAuthnAuditExtractor implements Function<ProfileRequestContext,
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Boolean apply(@Nullable final ProfileRequestContext input) {
         final AuthnRequest request = requestLookupStrategy.apply(input);
         if (request != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/InResponseToAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/InResponseToAuditExtractor.java
index ea1f269..fab9a25 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/InResponseToAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/InResponseToAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -25,8 +27,6 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml1.core.ResponseAbstractType;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the InResponseTo attribute from a response. */
@@ -45,7 +45,6 @@ public class InResponseToAuditExtractor implements Function<ProfileRequestContex
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final SAMLObject response = responseLookupStrategy.apply(input);
         if (response != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/IsPassiveAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/IsPassiveAuditExtractor.java
index 29041a0..52040f0 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/IsPassiveAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/IsPassiveAuditExtractor.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the IsPassive attribute from an {@link AuthnRequest}. */
@@ -43,7 +43,6 @@ public class IsPassiveAuditExtractor implements Function<ProfileRequestContext,B
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Boolean apply(@Nullable final ProfileRequestContext input) {
         final AuthnRequest request = requestLookupStrategy.apply(input);
         if (request != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDAuditExtractor.java
index 1324f2b..a569ce5 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -30,8 +32,6 @@ import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 import org.opensaml.saml.saml2.core.LogoutRequest;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the Name Identifier from a request or response. */
@@ -51,7 +51,6 @@ public class NameIDAuditExtractor implements Function<ProfileRequestContext,Stri
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         SAMLObject msg = responseLookupStrategy.apply(input);
         if (msg != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDFormatAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDFormatAuditExtractor.java
index c49c533..aa2ea6d 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDFormatAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/NameIDFormatAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -30,8 +32,6 @@ import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 import org.opensaml.saml.saml2.core.LogoutRequest;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the Name Identifier Format from an assertion in a response. */
@@ -51,7 +51,6 @@ public class NameIDFormatAuditExtractor implements Function<ProfileRequestContex
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         SAMLObject msg = responseLookupStrategy.apply(input);
         if (msg != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SessionIndexAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SessionIndexAuditExtractor.java
index 25c286e..2a1932c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SessionIndexAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/SessionIndexAuditExtractor.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.audit.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -33,8 +34,6 @@ import org.opensaml.saml.saml2.core.LogoutRequest;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.SessionIndex;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns SessionIndex values from assertions in a response or a logout request. */
@@ -54,7 +53,6 @@ public class SessionIndexAuditExtractor implements Function<ProfileRequestContex
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         
         SAMLObject message = messageLookupStrategy.apply(input);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusCodeAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusCodeAuditExtractor.java
index ec3cc1c..89afe50 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusCodeAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusCodeAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -25,8 +27,6 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml1.core.Response;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the StatusCode from a response. */
@@ -45,7 +45,6 @@ public class StatusCodeAuditExtractor implements Function<ProfileRequestContext,
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final SAMLObject response = responseLookupStrategy.apply(input);
         if (response != null) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusMessageAuditExtractor.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusMessageAuditExtractor.java
index 3bc3394..c1bcbdb 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusMessageAuditExtractor.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/audit/impl/StatusMessageAuditExtractor.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.audit.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -25,8 +27,6 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml1.core.Response;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the StatusMessage from a response. */
@@ -45,7 +45,6 @@ public class StatusMessageAuditExtractor implements Function<ProfileRequestConte
     }
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final ProfileRequestContext input) {
         final SAMLObject response = responseLookupStrategy.apply(input);
         if (response != null) {
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 3757cfd..2bd7813 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.audit.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -29,8 +30,6 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.saml1.core.Response;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /** {@link Function} that returns the lower-level StatusCode(s) from a response. */
@@ -50,7 +49,6 @@ public class SubStatusCodeAuditExtractor implements Function<ProfileRequestConte
 
 // Checkstyle: CyclomaticComplexity OFF
     /** {@inheritDoc} */
-    @Override
     @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         final SAMLObject response = responseLookupStrategy.apply(input);
         if (response != 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 2f86b55..df6a3db 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.audit.impl;
 
 import java.security.NoSuchAlgorithmException;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -43,9 +44,6 @@ import org.opensaml.profile.context.navigate.OutboundMessageContextLookup;
 import org.opensaml.saml.common.SAMLObject;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that produces F-TICKS log entries for successful SAML SSO responses. 
  * 
@@ -90,12 +88,12 @@ public class WriteFTICKSLog extends AbstractProfileAction {
     public WriteFTICKSLog() {
         relyingPartyLookupStrategy = new RelyingPartyIdLookupFunction();
         responderLookupStrategy = new ResponderIdLookupFunction();
-        usernameLookupStrategy = Functions.compose(new SubjectContextPrincipalLookupFunction(),
+        usernameLookupStrategy = new SubjectContextPrincipalLookupFunction().compose(
                 new ChildContextLookup(SubjectContext.class));
         authenticationMethodLookupStrategy = new AuthnContextAuditExtractor(
-                Functions.compose(new MessageLookup(SAMLObject.class), new OutboundMessageContextLookup()));
+                new MessageLookup(SAMLObject.class).compose(new OutboundMessageContextLookup()));
         statusCodeLookupStrategy = new StatusCodeAuditExtractor(
-                Functions.compose(new MessageLookup(SAMLObject.class), new OutboundMessageContextLookup()));
+                new MessageLookup(SAMLObject.class).compose(new OutboundMessageContextLookup()));
     }
     
     /**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/messaging/impl/InitializeRelyingPartyContextFromSAMLPeer.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/messaging/impl/InitializeRelyingPartyContextFromSAMLPeer.java
index 70219b0..3c45efa 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/messaging/impl/InitializeRelyingPartyContextFromSAMLPeer.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/messaging/impl/InitializeRelyingPartyContextFromSAMLPeer.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.messaging.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -30,9 +32,6 @@ import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.profile.impl.SAMLRelyingPartyIdLookupStrategy;
 import net.shibboleth.idp.saml.profile.impl.SAMLVerificationLookupStrategy;
@@ -70,14 +69,12 @@ public class InitializeRelyingPartyContextFromSAMLPeer extends AbstractMessageHa
     
     /** Constructor. */
     public InitializeRelyingPartyContextFromSAMLPeer() {
-        relyingPartyContextCreationStrategy = Functions.compose(
-                new ChildContextLookup<InOutOperationContext, RelyingPartyContext>(RelyingPartyContext.class, true),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
-        peerEntityContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<InOutOperationContext, SAMLPeerEntityContext>(SAMLPeerEntityContext.class),
-                new RecursiveTypedParentContextLookup<MessageContext,InOutOperationContext>(InOutOperationContext.class)
-                );
+        relyingPartyContextCreationStrategy =
+                new ChildContextLookup<>(RelyingPartyContext.class, true).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
+        peerEntityContextLookupStrategy =
+                new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                        new RecursiveTypedParentContextLookup<>(InOutOperationContext.class));
     }
 
     /**
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 a26a7e2..891d187 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -51,8 +52,6 @@ import org.opensaml.saml.saml1.profile.SAML1ObjectSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -79,9 +78,9 @@ public class AttributeSourcedSAML1NameIdentifierGenerator extends AbstractSAML1N
 
     /** Constructor. */
     public AttributeSourcedSAML1NameIdentifierGenerator() {
-        attributeContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<RelyingPartyContext,AttributeContext>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         delimiter = '@';
         attributeSourceIds = Collections.emptyList();
         setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
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 883a6e9..fa2158a 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -51,8 +52,6 @@ import org.opensaml.saml.saml2.profile.SAML2ObjectSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -79,9 +78,9 @@ public class AttributeSourcedSAML2NameIDGenerator extends AbstractSAML2NameIDGen
 
     /** Constructor. */
     public AttributeSourcedSAML2NameIDGenerator() {
-        attributeContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<RelyingPartyContext,AttributeContext>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         delimiter = '@';
         attributeSourceIds = Collections.emptyList();
         setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyCanonicalization.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyCanonicalization.java
index 568e7c2..43a98d4 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyCanonicalization.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyCanonicalization.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.nameid.impl;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -28,8 +29,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.LegacyPrincipalDecoder;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
@@ -155,7 +154,7 @@ public class LegacyCanonicalization extends AbstractSubjectCanonicalizationActio
          * <p>Iff there is a valid service and there are no parsing errors and the service does understand
          * principal connectors and there were some configured we will proceed.</p>
          */
-        @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
 
             if (null == input) {
                 return false;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyNameIdentifierGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyNameIdentifierGenerator.java
index 34a512c..64e83ce 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyNameIdentifierGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/LegacyNameIdentifierGenerator.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.saml.nameid.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -42,9 +45,6 @@ import org.opensaml.saml.common.profile.NameIdentifierGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -87,8 +87,8 @@ public class LegacyNameIdentifierGenerator<NameIdType extends SAMLObject>
         encoderType = Constraint.isNotNull(clazz, "Encoder class type cannot be null");
 
         // ProfileRequestContext -> RelyingPartyContext -> AttributeContext
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
     }
 
     /**
@@ -131,7 +131,7 @@ public class LegacyNameIdentifierGenerator<NameIdType extends SAMLObject>
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
         Constraint.isNotNull(format, "Format cannot be null or empty");
         
-        if (!activationCondition.apply(profileRequestContext)) {
+        if (!activationCondition.test(profileRequestContext)) {
             return null;
         }
         
@@ -146,8 +146,8 @@ public class LegacyNameIdentifierGenerator<NameIdType extends SAMLObject>
                 continue;
             }
             for (final AttributeEncoder encoder : idpAttribute.getEncoders()) {
-                if (encoderType.isInstance(encoder) && ((NameIdentifierAttributeEncoder) encoder).apply(format)
-                        && encoder.getActivationCondition().apply(profileRequestContext)) {
+                if (encoderType.isInstance(encoder) && ((NameIdentifierAttributeEncoder) encoder).test(format)
+                        && encoder.getActivationCondition().test(profileRequestContext)) {
                     try {
                         // The encoders throw unless they return an object.
                         final NameIdType nameId = (NameIdType) encoder.encode(idpAttribute);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalization.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalization.java
index e86bdd5..0aa6ad6 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalization.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalization.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.nameid.impl;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -43,8 +44,6 @@ import org.opensaml.saml.saml2.profile.SAML2ObjectSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 /**
  * Action to perform subject canonicalization, transforming the input {@link javax.security.auth.Subject}
  * into a principal name by searching for one and only one {@link NameIDPrincipal} custom principal,
@@ -138,7 +137,7 @@ public class NameIDCanonicalization extends AbstractSubjectCanonicalizationActio
         @Nonnull private Logger log = LoggerFactory.getLogger(ActivationCondition.class);
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
 
             if (input != null) {
                 final SubjectCanonicalizationContext c14nContext =
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalization.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalization.java
index 1404466..9881836 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalization.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalization.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.nameid.impl;
 
 import java.util.Set;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,8 +45,6 @@ import org.opensaml.saml.saml1.profile.SAML1ObjectSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Predicate;
-
 /**
  * Action to perform subject canonicalization, transforming the input {@link javax.security.auth.Subject}
  * into a principal name by searching for one and only one {@link NameIdentifierPrincipal} custom principal,
@@ -139,7 +138,7 @@ public class NameIdentifierCanonicalization extends AbstractSubjectCanonicalizat
         @Nonnull private Logger log = LoggerFactory.getLogger(ActivationCondition.class);
 
         /** {@inheritDoc} */
-        @Override public boolean apply(@Nullable final ProfileRequestContext input) {
+        public boolean test(@Nullable final ProfileRequestContext input) {
 
             if (input != null) {
                 final SubjectCanonicalizationContext c14nContext =
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
index d0ec803..e223e29 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -50,8 +51,6 @@ import org.opensaml.saml.saml2.profile.AbstractSAML2NameIDGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -84,9 +83,9 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
     public PersistentSAML2NameIDGenerator() {
         setFormat(NameID.PERSISTENT);
         subjectContextLookupStrategy = new ChildContextLookup<>(SubjectContext.class);
-        attributeContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<RelyingPartyContext, AttributeContext>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext, RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         attributeSourceIds = Collections.emptyList();
         setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
         setDefaultSPNameQualifierLookupStrategy(new RelyingPartyIdLookupFunction());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML1NameIdentifierGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML1NameIdentifierGenerator.java
index de6ddad..be03773 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML1NameIdentifierGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML1NameIdentifierGenerator.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.nameid.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -37,8 +39,6 @@ import org.opensaml.saml.saml1.profile.AbstractSAML1NameIdentifierGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Generator for transient {@link org.opensaml.saml.saml1.core.NameIdentifier} objects.
  */
@@ -67,8 +67,8 @@ public class TransientSAML1NameIdentifierGenerator extends AbstractSAML1NameIden
      * 
      * @param strategy lookup function to use
      */
-    public void setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext, 
-            SubjectContext> strategy) {
+    public void setSubjectContextLookupStrategy(
+            @Nonnull final Function<ProfileRequestContext,SubjectContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         subjectContextLookupStrategy = Constraint.isNotNull(strategy, "SubjectContext lookup strategy cannot be null");
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML2NameIDGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML2NameIDGenerator.java
index b5c6c7a..f4d7cfc 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML2NameIDGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/TransientSAML2NameIDGenerator.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.nameid.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -37,8 +39,6 @@ import org.opensaml.saml.saml2.profile.AbstractSAML2NameIDGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Generator for transient {@link NameID} objects.
  */
@@ -67,8 +67,8 @@ public class TransientSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
      * 
      * @param strategy lookup function to use
      */
-    public void setSubjectContextLookupStrategy(@Nonnull final Function<ProfileRequestContext,
-            SubjectContext> strategy) {
+    public void setSubjectContextLookupStrategy(
+            @Nonnull final Function<ProfileRequestContext,SubjectContext> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         subjectContextLookupStrategy = Constraint.isNotNull(strategy, "SubjectContext lookup strategy cannot be null");
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAttributeStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAttributeStatementToAssertion.java
index 3a2d39f..e48e2b6 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAttributeStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAttributeStatementToAssertion.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -40,9 +42,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Base class for actions that encode an {@link AttributeContext} into a SAML attribute statement.
 
@@ -94,8 +93,8 @@ public abstract class BaseAddAttributeStatementToAssertion extends AbstractProfi
         statementInOwnAssertion = false;
         ignoringUnencodableAttributes = true;
 
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
         idGeneratorLookupStrategy = new IdentifierGenerationStrategyLookupFunction();
         issuerLookupStrategy = new ResponderIdLookupFunction();
     }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAuthenticationStatementToAssertion.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAuthenticationStatementToAssertion.java
index c84bf5b..7c823dd 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAuthenticationStatementToAssertion.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/BaseAddAuthenticationStatementToAssertion.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -38,8 +40,6 @@ import net.shibboleth.utilities.java.support.security.IdentifierGenerationStrate
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for actions that encode authentication information into a SAML 1 or SAML 2 statement.
  * 
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
index 409d933..2df1087 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.saml.profile.impl;
 
 import java.util.Collections;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,9 +46,6 @@ import org.opensaml.saml.saml2.core.NameID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * Action that extracts a SAML Subject from an inbound message, and prepares a
  * {@link SubjectCanonicalizationContext} to process it into a principal identity.
@@ -146,7 +145,7 @@ public class ExtractSubjectFromRequest extends AbstractProfileAction {
             return false;
         }
         
-        if (nameIDPolicyPredicate != null && !nameIDPolicyPredicate.apply(profileRequestContext)) {
+        if (nameIDPolicyPredicate != null && !nameIDPolicyPredicate.test(profileRequestContext)) {
             log.warn("{} Consumption of NameID/NameIdentifier blocked by policy", getLogPrefix());
             ActionSupport.buildEvent(profileRequestContext, AuthnEventIds.INVALID_SUBJECT);
             return false;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContext.java
index 6b4c155..5a909fd 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContext.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -33,10 +36,6 @@ import org.opensaml.saml.saml2.core.AuthnRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-
 /**
  * An action that creates an {@link AuthenticationContext} and attaches it to the current {@link ProfileRequestContext}.
  * 
@@ -64,8 +63,7 @@ public class InitializeAuthenticationContext extends AbstractProfileAction {
     /** Constructor. */
     public InitializeAuthenticationContext() {
         forceAuthnPredicate = new ForceAuthnProfileConfigPredicate();
-        requestLookupStrategy =
-                Functions.compose(new MessageLookup<>(AuthnRequest.class), new InboundMessageContextLookup());
+        requestLookupStrategy = new MessageLookup<>(AuthnRequest.class).compose(new InboundMessageContextLookup());
     }
     
     /**
@@ -120,7 +118,7 @@ public class InitializeAuthenticationContext extends AbstractProfileAction {
         }
 
         if (!authnCtx.isForceAuthn()) {
-            authnCtx.setForceAuthn(forceAuthnPredicate.apply(profileRequestContext));
+            authnCtx.setForceAuthn(forceAuthnPredicate.test(profileRequestContext));
         }
         
         profileRequestContext.addSubcontext(authnCtx, true);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
index 11c8b00..fbe95dc 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -39,8 +41,6 @@ import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that adds an outbound {@link MessageContext} and related SAML contexts to the {@link ProfileRequestContext}
  * based on the identity of a relying party accessed via a lookup strategy, by default an immediate child of the profile
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
index 681e060..9043fd0 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -43,9 +45,6 @@ import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that prepares an outbound {@link MessageContext} and related SAML contexts
  * in the event that they are not already prepared, to allow error responses to be
@@ -82,8 +81,8 @@ public class InitializeOutboundMessageContextForError extends AbstractProfileAct
     public InitializeOutboundMessageContextForError() {
         
         // Default: outbound msg context -> SAMLBindingContext
-        bindingContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLBindingContext.class, true), new OutboundMessageContextLookup());
+        bindingContextLookupStrategy =
+                new ChildContextLookup<>(SAMLBindingContext.class, true).compose(new OutboundMessageContextLookup());
         
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
     }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeer.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeer.java
index 9289b77..5643c5c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeer.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeer.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -36,9 +38,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that adds a {@link RelyingPartyContext} to the current {@link ProfileRequestContext} tree
  * via a creation function. The context is populated via a lookup strategy to locate a {@link SAMLPeerEntityContext},
@@ -74,8 +73,8 @@ public class InitializeRelyingPartyContextFromSAMLPeer extends AbstractProfileAc
     /** Constructor. */
     public InitializeRelyingPartyContextFromSAMLPeer() {
         relyingPartyContextCreationStrategy = new ChildContextLookup<>(RelyingPartyContext.class, true);
-        peerEntityContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLPeerEntityContext.class), new InboundMessageContextLookup());
+        peerEntityContextLookupStrategy =
+                new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(new InboundMessageContextLookup());
     }
 
     /**
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 9e67888..793bf4f 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.profile.impl;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -67,10 +68,7 @@ import org.opensaml.saml.saml2.metadata.IndexedEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
 /**
@@ -160,24 +158,24 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
         
         // Default: outbound msg context -> SAMLPeerEntityContext -> SAMLMetadataContext
-        metadataContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLMetadataContext.class),
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class),
-                        new OutboundMessageContextLookup()));
+        metadataContextLookupStrategy =
+                new ChildContextLookup<>(SAMLMetadataContext.class).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                                new OutboundMessageContextLookup()));
         
         // Default: outbound msg context -> SAMLBindingContext
-        bindingContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLBindingContext.class, true), new OutboundMessageContextLookup());
+        bindingContextLookupStrategy =
+                new ChildContextLookup<>(SAMLBindingContext.class, true).compose(new OutboundMessageContextLookup());
 
         // Default: outbound msg context -> SAMLArtifactContext
-        artifactContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLArtifactContext.class, true), new OutboundMessageContextLookup());
+        artifactContextLookupStrategy =
+                new ChildContextLookup<>(SAMLArtifactContext.class, true).compose(new OutboundMessageContextLookup());
         
         // Default: outbound msg context -> SAMLPeerEntityContext -> SAMLEndpointContext
-        endpointContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLEndpointContext.class, true),
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class, true),
-                        new OutboundMessageContextLookup()));
+        endpointContextLookupStrategy =
+                new ChildContextLookup<>(SAMLEndpointContext.class, true).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class, true).compose(
+                                new OutboundMessageContextLookup()));
         
         artifactImpliesSecureChannel = true;
     }
@@ -350,7 +348,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
                 if (profileConfiguration instanceof BrowserSSOProfileConfiguration) {
                     skipValidationSinceSigned =
                             ((BrowserSSOProfileConfiguration) profileConfiguration)
-                                .getSkipEndpointValidationWhenSignedPredicate().apply(profileRequestContext)
+                                .getSkipEndpointValidationWhenSignedPredicate().test(profileRequestContext)
                             && inboundMessage instanceof AuthnRequest
                             && SAMLBindingSupport.isMessageSigned(profileRequestContext.getInboundMessageContext()); 
                 }
@@ -390,7 +388,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
         // Compile binding list.
         final List<String> bindings = new ArrayList<>(bindingDescriptors.size());
         for (final BindingDescriptor bindingDescriptor : bindingDescriptors) {
-            if (bindingDescriptor.apply(profileRequestContext)) {
+            if (bindingDescriptor.test(profileRequestContext)) {
                 bindings.add(bindingDescriptor.getId());
             }
         }
@@ -439,13 +437,8 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
         final SAMLBindingContext bindingCtx = bindingContextLookupStrategy.apply(profileRequestContext);
         bindingCtx.setRelayState(SAMLBindingSupport.getRelayState(profileRequestContext.getInboundMessageContext()));
         
-        final Optional<BindingDescriptor> bindingDescriptor = Iterables.tryFind(bindingDescriptors,
-                new Predicate<BindingDescriptor>() {
-                    @Override
-                    public boolean apply(final BindingDescriptor input) {
-                        return input.getId().equals(bindingURI);
-                    }
-        });
+        final Optional<BindingDescriptor> bindingDescriptor =
+                Iterables.tryFind(bindingDescriptors, b -> b.getId().equals(bindingURI));
 
         if (bindingDescriptor.isPresent()) {
             bindingCtx.setBindingDescriptor(bindingDescriptor.get());
@@ -488,13 +481,8 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
             final SAMLBindingContext bindingCtx =
                     profileRequestContext.getInboundMessageContext().getSubcontext(SAMLBindingContext.class);
             if (bindingCtx != null && bindingCtx.getBindingUri() != null) {
-                final Optional<BindingDescriptor> binding = Iterables.tryFind(bindingDescriptors,
-                        new Predicate<BindingDescriptor>() {
-                            @Override
-                            public boolean apply(final BindingDescriptor input) {
-                                return input.getId().equals(bindingCtx.getBindingUri());
-                            }
-                        });
+                final Optional<BindingDescriptor> binding =
+                        Iterables.tryFind(bindingDescriptors, b -> b.getId().equals(bindingCtx.getBindingUri()));
                 if (binding.isPresent() && binding.get().isSynchronous()) {
                     log.debug("{} Handling request via synchronous binding, preparing outbound binding context for {}",
                             getLogPrefix(), binding.get().getId());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
index 55699ed..821991c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -33,8 +35,6 @@ import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that adds a {@link SAMLSelfEntityContext} to the inbound {@link MessageContext}
  * 
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLRelyingPartyIdLookupStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLRelyingPartyIdLookupStrategy.java
index b161dd7..64f65f6 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLRelyingPartyIdLookupStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLRelyingPartyIdLookupStrategy.java
@@ -33,7 +33,6 @@ import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 public class SAMLRelyingPartyIdLookupStrategy implements ContextDataLookupFunction<RelyingPartyContext, String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final RelyingPartyContext input) {
         
         final BaseContext ctx = input != null ? input.getRelyingPartyIdContextTree() : null;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLVerificationLookupStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLVerificationLookupStrategy.java
index 77fff92..1979736 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLVerificationLookupStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/SAMLVerificationLookupStrategy.java
@@ -37,7 +37,6 @@ import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 public class SAMLVerificationLookupStrategy implements ContextDataLookupFunction<RelyingPartyContext,Boolean> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public Boolean apply(@Nullable final RelyingPartyContext input) {
         
         final BaseContext ctx = input != null ? input.getRelyingPartyIdContextTree() : null;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/relyingparty/impl/RelyingPartyConfigurationSupport.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/relyingparty/impl/RelyingPartyConfigurationSupport.java
index f8622a2..4e8a007 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/relyingparty/impl/RelyingPartyConfigurationSupport.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/relyingparty/impl/RelyingPartyConfigurationSupport.java
@@ -30,8 +30,6 @@ import org.opensaml.saml.common.profile.logic.EntityGroupNamePredicate;
 import org.opensaml.saml.metadata.resolver.MetadataResolver;
 import org.opensaml.saml.saml2.metadata.EntityDescriptor;
 
-import com.google.common.base.Functions;
-
 import net.shibboleth.idp.profile.logic.RelyingPartyIdPredicate;
 import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
 import net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLookupFunction;
@@ -97,7 +95,7 @@ public final class RelyingPartyConfigurationSupport {
         
         final StrategyIndirectedPredicate<ProfileRequestContext,EntityDescriptor> indirectPredicate =
                 new StrategyIndirectedPredicate<>(
-                        Functions.compose(new EntityDescriptorLookupFunction(),new SAMLMetadataContextLookupFunction()),
+                        new EntityDescriptorLookupFunction().compose(new SAMLMetadataContextLookupFunction()),
                         new EntityGroupNamePredicate(groupNames, resolver));
         
         final RelyingPartyConfiguration config = new RelyingPartyConfiguration();
@@ -134,7 +132,7 @@ public final class RelyingPartyConfigurationSupport {
         
         final StrategyIndirectedPredicate<ProfileRequestContext,EntityDescriptor> indirectPredicate =
                 new StrategyIndirectedPredicate<>(
-                        Functions.compose(new EntityDescriptorLookupFunction(),new SAMLMetadataContextLookupFunction()),
+                        new EntityDescriptorLookupFunction().compose(new SAMLMetadataContextLookupFunction()),
                         new EntityAttributesPredicate(candidates, trim, matchAll));
         
         final RelyingPartyConfiguration config = new RelyingPartyConfiguration();
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 e3b9987..b3ccd54 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.saml1.profile.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -49,7 +50,6 @@ import org.opensaml.saml.saml1.profile.SAML1ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -181,7 +181,7 @@ public class AddAttributeStatementToAssertion extends BaseAddAttributeStatementT
         for (final AttributeEncoder<?> encoder : encoders) {
             if (SAMLConstants.SAML11P_NS.equals(encoder.getProtocol())
                     && encoder instanceof SAML1AttributeEncoder
-                    && encoder.getActivationCondition().apply(profileRequestContext)) {
+                    && encoder.getActivationCondition().test(profileRequestContext)) {
                 log.debug("{} Encoding attribute {} as a SAML 1 Attribute", getLogPrefix(), attribute.getId());
                 try {
                     added = true;
@@ -215,7 +215,6 @@ public class AddAttributeStatementToAssertion extends BaseAddAttributeStatementT
     private class AssertionStrategy implements Function<ProfileRequestContext,Assertion> {
 
         /** {@inheritDoc} */
-        @Override
         @Nullable public Assertion apply(@Nullable final ProfileRequestContext input) {
             if (input != null && input.getOutboundMessageContext() != null) {
                 final Object outboundMessage = input.getOutboundMessageContext().getMessage();
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 0a7be92..6b442bb 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml1.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -48,8 +50,6 @@ import org.opensaml.saml.saml1.profile.SAML1ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that builds an {@link AuthenticationStatement} and adds it to an {@link Assertion} returned by a lookup
  * strategy, by default in the {@link ProfileRequestContext#getOutboundMessageContext()}.
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 2c7cda0..6c97e94 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.saml1.profile.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +41,6 @@ import org.opensaml.saml.saml1.core.Request;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.collect.Multimap;
 
 /**
@@ -78,10 +77,10 @@ public class FilterByQueriedAttributeDesignators extends AbstractProfileAction {
     public FilterByQueriedAttributeDesignators(@Nonnull final SAML1AttributeDesignatorsMapperService mapper) {
         mapperService = Constraint.isNotNull(mapper, "MapperService cannot be null");
         
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
         
-        requestLookupStrategy = Functions.compose(new MessageLookup(Request.class), 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 f94c05a..fbb48c8 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -43,8 +45,6 @@ import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that builds an {@link AuthnStatement} and adds it to an {@link Assertion} returned by a lookup
  * strategy, by default in the {@link ProfileRequestContext#getOutboundMessageContext()}.
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 2bc4d74..511850c 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -40,8 +41,6 @@ import org.opensaml.saml.saml2.core.Response;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action which adds a {@link DelegationPolicy} element to the {@link Advice} of an {@link Assertion}.
  * 
@@ -67,10 +66,10 @@ import com.google.common.base.Function;
 public class AddDelegationPolicyToAssertion extends AbstractProfileAction {
     
     /** Default policy max chain length, when can't otherwise be derived. */
-    public static final Long DEFAULT_POLICY_MAX_CHAIN_LENGTH = 1L;
+    @Nonnull public static final Long DEFAULT_POLICY_MAX_CHAIN_LENGTH = 1L;
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AddDelegationPolicyToAssertion.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AddDelegationPolicyToAssertion.class);
     
     /** Strategy used to locate the {@link Assertion} to operate on. */
     @Nonnull private Function<ProfileRequestContext,Assertion> assertionLookupStrategy;
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 00a8cf0..f33e945 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -50,9 +51,6 @@ import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action which adds a {@link DelegationRestrictionType} {@link Condition} to each {@link Assertion}
  * contained within the outbound {@link Response}.
@@ -84,7 +82,7 @@ public class AddDelegationRestrictionToAssertions extends AbstractProfileAction
     @Nonnull private Function<ProfileRequestContext,SAMLPresenterEntityContext> presenterContextLookupStrategy;
     
     /** Function used to resolve the Liberty context to populate. */
-    @Nonnull private Function<ProfileRequestContext, LibertySSOSContext> libertyContextLookupStrategy;
+    @Nonnull private Function<ProfileRequestContext,LibertySSOSContext> libertyContextLookupStrategy;
     
     /** List of assertions to modify. */
     @Nullable private List<Assertion> assertions;
@@ -105,10 +103,9 @@ public class AddDelegationRestrictionToAssertions extends AbstractProfileAction
      * Constructor.
      */
     public AddDelegationRestrictionToAssertions() {
-        responseLookupStrategy =
-                Functions.compose(new MessageLookup<>(Response.class), new OutboundMessageContextLookup());
+        responseLookupStrategy = new MessageLookup<>(Response.class).compose(new OutboundMessageContextLookup());
         presenterContextLookupStrategy =
-                Functions.compose(new ChildContextLookup<>(SAMLPresenterEntityContext.class), 
+                new ChildContextLookup<>(SAMLPresenterEntityContext.class).compose( 
                         new InboundMessageContextLookup());
         
         libertyContextLookupStrategy = new ChildContextLookup<>(LibertySSOSContext.class);
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 6de1541..8abaaf1 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -28,7 +29,6 @@ import javax.servlet.http.HttpServletRequest;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.saml2.profile.delegation.DelegationContext;
-import net.shibboleth.utilities.java.support.annotation.Prototype;
 import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
@@ -77,8 +77,6 @@ import org.opensaml.xmlsec.signature.KeyInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A profile action which decorates instances of {@link Assertion} appropriately for use as delegation tokens.
  * 
@@ -115,7 +113,6 @@ import com.google.common.base.Function;
  * 
  * @event {@link EventIds#INVALID_PROFILE_CTX}
  */
- at Prototype
 public class DecorateDelegatedAssertion extends AbstractProfileAction {
     
     /** Class logger. */
@@ -162,8 +159,6 @@ public class DecorateDelegatedAssertion extends AbstractProfileAction {
     
     /** Constructor. */
     public DecorateDelegatedAssertion() {
-        super();
-        
         libertySSOSEndpointURLLookupStrategy = new LibertySSOSEndpointURLStrategy();
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
         delegationContextLookupStrategy = new ChildContextLookup<>(DelegationContext.class);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DelegatedAssertionLookupStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DelegatedAssertionLookupStrategy.java
index ae8bdc2..41dcc15 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DelegatedAssertionLookupStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/DelegatedAssertionLookupStrategy.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -29,15 +31,13 @@ import org.opensaml.saml.saml2.core.Assertion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Lookup function to return the valid delegated assertion token in effect for the Liberty SSOS request.
  */
 public class DelegatedAssertionLookupStrategy implements Function<ProfileRequestContext, Assertion> {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(DelegatedAssertionLookupStrategy.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(DelegatedAssertionLookupStrategy.class);
     
     /** Function used to resolve the Liberty context to populate. */
     @Nonnull private Function<ProfileRequestContext, LibertySSOSContext> libertyContextLookupStrategy;
@@ -58,8 +58,7 @@ public class DelegatedAssertionLookupStrategy implements Function<ProfileRequest
     }
 
     /** {@inheritDoc} */
-    @Nullable
-    public Assertion apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public Assertion apply(@Nullable final ProfileRequestContext input) {
         if (input == 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 afdf101..b148318 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
@@ -18,6 +18,8 @@
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
 import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -27,7 +29,6 @@ import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.idwsf.profile.config.SSOSProfileConfiguration;
 import net.shibboleth.idp.saml.xmlobject.DelegationPolicy;
-import net.shibboleth.utilities.java.support.annotation.Prototype;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
@@ -44,9 +45,6 @@ import org.opensaml.saml.saml2.core.Conditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
 /**
  * Action which implements policy controls to decide whether an SSO request based
  * on a delegated {@link Assertion} token is allowed to proceed.
@@ -76,14 +74,13 @@ import com.google.common.base.Predicate;
  * @event {@link EventIds#INVALID_PROFILE_CTX}
  * @event {@link EventIds#INVALID_SEC_CFG}
  */
- at Prototype
 public class EvaluateDelegationPolicy extends AbstractProfileAction {
     
     /** Default policy max chain length, when can't otherwise be derived. */
-    public static final Long DEFAULT_POLICY_MAX_CHAIN_LENGTH = 1L;
+    @Nonnull public static final Long DEFAULT_POLICY_MAX_CHAIN_LENGTH = 1L;
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(EvaluateDelegationPolicy.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(EvaluateDelegationPolicy.class);
     
     // Configured data
     
@@ -234,7 +231,7 @@ public class EvaluateDelegationPolicy extends AbstractProfileAction {
      * @return true if check passes, false if not
      */
     protected boolean checkAllowedDelegate(@Nonnull final ProfileRequestContext profileRequestContext) {
-        if (!delegationPredicate.apply(profileRequestContext)) {
+        if (!delegationPredicate.test(profileRequestContext)) {
             log.warn("Delegation predicate eval indicates delegated token use NOT allowed");
             ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_SEC_CFG);
             return false;
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 c21321f..45758c1 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -29,7 +30,6 @@ import net.shibboleth.idp.saml.profile.context.navigate.SAMLMetadataContextLooku
 import net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfiguration;
 import net.shibboleth.idp.saml.saml2.profile.delegation.DelegationContext;
 import net.shibboleth.idp.saml.saml2.profile.delegation.DelegationRequest;
-import net.shibboleth.utilities.java.support.annotation.Prototype;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -59,8 +59,6 @@ import org.opensaml.security.criteria.UsageCriterion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A profile action which determines whether issuance of a delegated 
  * {@link org.opensaml.saml.saml2.core.Assertion} token
@@ -116,11 +114,10 @@ import com.google.common.base.Function;
  * @event {@link EventIds#MESSAGE_PROC_ERROR}
  * @event {@link EventIds#INVALID_SEC_CFG}
  */
- at Prototype
 public class PopulateDelegationContext extends AbstractProfileAction {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(PopulateDelegationContext.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(PopulateDelegationContext.class);
     
     // Configured data
     
@@ -171,8 +168,6 @@ public class PopulateDelegationContext extends AbstractProfileAction {
      * Constructor.
      */
     public PopulateDelegationContext() {
-        super();
-        
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
         samlMetadataContextLookupStrategy = new SAMLMetadataContextLookupFunction();
         delegationContextLookupStrategy = new ChildContextLookup<>(DelegationContext.class, true);
@@ -346,7 +341,7 @@ public class PopulateDelegationContext extends AbstractProfileAction {
         if (relyingPartyContext.getProfileConfig() instanceof BrowserSSOProfileConfiguration) {
             final BrowserSSOProfileConfiguration config = 
                     (BrowserSSOProfileConfiguration) relyingPartyContext.getProfileConfig();
-            delegationAllowed = config.getAllowDelegation().apply(profileRequestContext);
+            delegationAllowed = config.getAllowDelegation().test(profileRequestContext);
         } else {
             log.debug("ProfileConfiguration does not support delegation: {}", 
                     relyingPartyContext.getProfileConfig().getClass().getName());
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 53974ad..aff2843 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
@@ -17,13 +17,14 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.saml.saml2.profile.delegation.LibertySSOSContext;
-import net.shibboleth.utilities.java.support.annotation.Prototype;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
@@ -37,8 +38,6 @@ import org.opensaml.soap.wssecurity.messaging.WSSecurityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 
 /**
  * Locate a pre-validated {@link org.opensaml.saml.saml2.core.Assertion} WS-Security token,
@@ -56,11 +55,10 @@ import com.google.common.base.Function;
  * @post <pre>LibertySSOSContext.getAttestedToken() != null</pre>
  * @post <pre>LibertySSOSContext.getAttestedSubjectConfirmationMethod != null</pre>
  */
- at Prototype
 public class PopulateLibertyContext extends AbstractProfileAction {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(PopulateLibertyContext.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(PopulateLibertyContext.class);
     
     /** Function used to resolve the assertion token to process. */
     @Nonnull private Function<ProfileRequestContext, SAML20AssertionToken> assertionTokenStrategy;
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateOutboundMessageContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateOutboundMessageContext.java
index 9fec17e..41c9a38 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateOutboundMessageContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateOutboundMessageContext.java
@@ -19,6 +19,8 @@ package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
 import net.shibboleth.idp.profile.AbstractProfileAction;
 
+import javax.annotation.Nonnull;
+
 import org.joda.time.DateTime;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.profile.action.ActionSupport;
@@ -38,7 +40,7 @@ import org.slf4j.LoggerFactory;
 public class PopulateOutboundMessageContext extends AbstractProfileAction {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(PopulateOutboundMessageContext.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(PopulateOutboundMessageContext.class);
 
 //CheckStyle: ReturnCount OFF
     /** {@inheritDoc} */
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 4a11a27..4b8f3df 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.security.auth.Subject;
@@ -31,14 +33,11 @@ import org.opensaml.saml.saml2.core.NameID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.context.navigate.ResponderIdLookupFunction;
 import net.shibboleth.idp.saml.authn.principal.NameIDPrincipal;
-import net.shibboleth.utilities.java.support.annotation.Prototype;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.xml.SerializeSupport;
@@ -58,12 +57,10 @@ import net.shibboleth.utilities.java.support.xml.SerializeSupport;
  * @pre <pre>assertionTokenStrategy.apply(profileRequestContext).getSubject().getNameID() != null</pre>
  * @post <pre>profileRequestContext.getSubcontext(SubjectCanonicalizationContext.class) != null</pre>
  */
- at Prototype
 public class ProcessDelegatedAssertion extends AbstractProfileAction {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(ProcessDelegatedAssertion.class);
-    
+    @Nonnull private Logger log = LoggerFactory.getLogger(ProcessDelegatedAssertion.class);
 
     /** Function used to obtain the requester ID, for purposes of Subject c14n. */
     @Nullable private Function<ProfileRequestContext,String> requesterLookupStrategy;
@@ -94,8 +91,7 @@ public class ProcessDelegatedAssertion extends AbstractProfileAction {
      * 
      * @param strategy lookup strategy
      */
-    public void setAssertionTokenStrategy(
-            @Nonnull final Function<ProfileRequestContext,Assertion> strategy) {
+    public void setAssertionTokenStrategy(@Nonnull final Function<ProfileRequestContext,Assertion> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         assertionTokenStrategy = Constraint.isNotNull(strategy, "Assertion token strategy may not be null");
@@ -106,8 +102,7 @@ public class ProcessDelegatedAssertion extends AbstractProfileAction {
      * 
      * @param strategy lookup strategy
      */
-    public void setRequesterLookupStrategy(
-            @Nullable final Function<ProfileRequestContext,String> strategy) {
+    public void setRequesterLookupStrategy(@Nullable final Function<ProfileRequestContext,String> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         requesterLookupStrategy = strategy;
@@ -118,8 +113,7 @@ public class ProcessDelegatedAssertion extends AbstractProfileAction {
      * 
      * @param strategy lookup strategy
      */
-    public void setResponderLookupStrategy(
-            @Nullable final Function<ProfileRequestContext,String> strategy) {
+    public void setResponderLookupStrategy(@Nullable final Function<ProfileRequestContext,String> strategy) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
 
         responderLookupStrategy = strategy;
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 adc4ea6..2d594ed 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.messaging.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -34,18 +36,16 @@ import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Handler implementation that adds a Liberty sb:Sender header to the outbound SOAP envelope.
  */
 public class AddSenderHandler extends AbstractHeaderGeneratingMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AddSenderHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AddSenderHandler.class);
     
     /** The providerId lookup function. */
-    private Function<MessageContext, String> providerIdLookupFunction;
+    @Nonnull private Function<MessageContext, String> providerIdLookupFunction;
     
     /** The providerId value to send. */
     private String providerId;
@@ -53,7 +53,6 @@ public class AddSenderHandler extends AbstractHeaderGeneratingMessageHandler {
     /** Constructor. *
      */
     public AddSenderHandler() {
-        super();
         providerIdLookupFunction = new SAMLSelfEntityIDLookupFunction();
     }
 
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 2bbcf9e..56f03b2 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
@@ -20,6 +20,7 @@ package net.shibboleth.idp.saml.saml2.profile.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -49,7 +50,6 @@ import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -183,7 +183,7 @@ public class AddAttributeStatementToAssertion extends BaseAddAttributeStatementT
         for (final AttributeEncoder<?> encoder : encoders) {
             if (SAMLConstants.SAML20P_NS.equals(encoder.getProtocol())
                     && encoder instanceof SAML2AttributeEncoder
-                    && encoder.getActivationCondition().apply(profileRequestContext)) {
+                    && encoder.getActivationCondition().test(profileRequestContext)) {
                 log.debug("{} Encoding attribute {} as a SAML 2 Attribute", getLogPrefix(), attribute.getId());
                 try {
                     results.add((Attribute) encoder.encode(attribute));
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 ec2c9e5..eff89e6 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.saml2.profile.impl;
 
 import java.security.Principal;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -55,8 +56,6 @@ import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that builds an {@link AuthnStatement} and adds it to an {@link Assertion} returned by a lookup
  * strategy, by default in the {@link ProfileRequestContext#getOutboundMessageContext()}.
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 9779cdd..6a0b268 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.saml2.profile.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -41,8 +42,6 @@ import org.opensaml.saml.saml2.core.AttributeQuery;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.collect.Multimap;
 
 /**
@@ -79,11 +78,10 @@ public class FilterByQueriedAttributes extends AbstractProfileAction {
     public FilterByQueriedAttributes(@Nonnull final SAML2AttributesMapperService mapper) {
         mapperService = Constraint.isNotNull(mapper, "MapperService cannot be null");
         
-        attributeContextLookupStrategy = Functions.compose(new ChildContextLookup<>(AttributeContext.class),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        attributeContextLookupStrategy = new ChildContextLookup<>(AttributeContext.class).compose(
+                new ChildContextLookup<>(RelyingPartyContext.class));
         
-        queryLookupStrategy = Functions.compose(new MessageLookup(AttributeQuery.class),
-                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 3773ac1..6590239 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -40,9 +42,6 @@ import org.opensaml.saml.saml2.metadata.AttributeConsumingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that ensures that the attributes in the ACS (if any) are mapped.
  */
@@ -69,12 +68,9 @@ public class MapRequestedAttributesInAttributeConsumingService extends AbstractP
         super();
         // At this point, by default  the SAMLMetadataContext hangs off the SAMLPeerContext
         attributeConsumingServiceContextLookupStrategy =
-                Functions.compose(
-                         new ChildContextLookup(AttributeConsumingServiceContext.class),
-                         Functions.compose(
-                                 new ChildContextLookup<>(SAMLMetadataContext.class),
-                                 Functions.compose(
-                                        new ChildContextLookup<>(SAMLPeerEntityContext.class),
+                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 8fb20d4..4d61ac8 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
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.saml2.profile.impl;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -62,9 +63,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Action that resolves and populates {@link EncryptionParameters} on an {@link EncryptionContext}
  * created/accessed via a lookup function, by default on a {@link RelyingPartyContext} child of the
@@ -129,14 +127,13 @@ public class PopulateEncryptionParameters extends AbstractProfileAction {
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
         
         // Create context by default.
-        encryptionContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(EncryptionContext.class, true),
-                new ChildContextLookup<ProfileRequestContext,RelyingPartyContext>(RelyingPartyContext.class));
+        encryptionContextLookupStrategy =
+                new ChildContextLookup<>(EncryptionContext.class, true).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
 
         // Default: outbound msg context -> SAMLPeerEntityContext
         peerContextLookupStrategy =
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class),
-                        new OutboundMessageContextLookup());
+                new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(new OutboundMessageContextLookup());
     }
     
     /**
@@ -151,7 +148,6 @@ public class PopulateEncryptionParameters extends AbstractProfileAction {
         relyingPartyContextLookupStrategy =
                 Constraint.isNotNull(strategy, "RelyingPartyContext lookup strategy cannot be null");
     }
-    
 
     /**
      * Set the strategy used to look up the {@link EncryptionContext} to set the flags for.
@@ -278,13 +274,13 @@ public class PopulateEncryptionParameters extends AbstractProfileAction {
         final SAML2ProfileConfiguration profileConfiguration = (SAML2ProfileConfiguration) rpContext.getProfileConfig();
         
         if (!encryptIdentifiers) {
-            encryptIdentifiers = profileConfiguration.getEncryptNameIDs().apply(profileRequestContext);
+            encryptIdentifiers = profileConfiguration.getEncryptNameIDs().test(profileRequestContext);
             // Encryption can only be optional if the request didn't specify it above.
             encryptionOptional = profileConfiguration.isEncryptionOptional();
         }
         
-        encryptAssertions = profileConfiguration.getEncryptAssertions().apply(profileRequestContext);
-        encryptAttributes = profileConfiguration.getEncryptAttributes().apply(profileRequestContext);
+        encryptAssertions = profileConfiguration.getEncryptAssertions().test(profileRequestContext);
+        encryptAttributes = profileConfiguration.getEncryptAttributes().test(profileRequestContext);
         
         if (!encryptAssertions && !encryptIdentifiers && !encryptAttributes) {
             log.debug("{} No encryption requested, nothing to do", getLogPrefix());
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 11da9e3..19f8087 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
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -60,8 +61,6 @@ import org.opensaml.saml.saml2.profile.SAML2ObjectSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 
 /**
@@ -146,7 +145,7 @@ public class ProcessLogoutRequest extends AbstractProfileAction {
             }
         };
     
-        logoutRequestLookupStrategy = Functions.compose(new MessageLookup<>(LogoutRequest.class),
+        logoutRequestLookupStrategy = new MessageLookup<>(LogoutRequest.class).compose(
                 new InboundMessageContextLookup());
         
         qualifiedNameIDFormatsLookupStrategy = new QualifiedNameIDFormatsLookupFunction();
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContext.java
index 2d5bf03..86c703c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContext.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -56,9 +57,6 @@ import org.opensaml.saml.saml2.core.RequestedAuthnContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * An authentication action that processes the {@link RequestedAuthnContext} in a SAML 2 {@link AuthnRequest},
  * and populates a {@link RequestedPrincipalContext} with the corresponding information.
@@ -93,8 +91,7 @@ public class ProcessRequestedAuthnContext extends AbstractAuthenticationAction {
     /** Constructor. */
     public ProcessRequestedAuthnContext() {
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
-        authnRequestLookupStrategy =
-                Functions.compose(new MessageLookup<>(AuthnRequest.class), new InboundMessageContextLookup());
+        authnRequestLookupStrategy = new MessageLookup<>(AuthnRequest.class).compose(new InboundMessageContextLookup());
         ignoredContexts = Collections.singleton(AuthnContext.UNSPECIFIED_AUTHN_CTX);
     }
 
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 fb7770f..3234560 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.saml2.profile.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -55,9 +57,6 @@ import org.opensaml.soap.common.SOAPException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Profile action that propagates a prepared {@link LogoutRequest} message to an SP via the SOAP
  * binding, encapsulating SOAP pipeline construction and execution.
@@ -119,22 +118,22 @@ public class SOAPLogoutRequest extends AbstractProfileAction {
     /** Constructor. */
     public SOAPLogoutRequest() {
         
-        logoutRequestLookupStrategy = Functions.compose(new MessageLookup<>(LogoutRequest.class),
-                new OutboundMessageContextLookup());
+        logoutRequestLookupStrategy =
+                new MessageLookup<>(LogoutRequest.class).compose(new OutboundMessageContextLookup());
 
         propagationContextLookupStrategy = new ChildContextLookup<>(LogoutPropagationContext.class);
         
         // Default: outbound msg context -> SAMLPeerEntityContext -> SAMLMetadataContext
-        metadataContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLMetadataContext.class),
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class),
-                        new OutboundMessageContextLookup()));
+        metadataContextLookupStrategy =
+                new ChildContextLookup<>(SAMLMetadataContext.class).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                                new OutboundMessageContextLookup()));
 
         // Default: outbound msg context -> SAMLPeerEntityContext -> SAMLEndpointContext
-        endpointContextLookupStrategy = Functions.compose(
-                new ChildContextLookup<>(SAMLEndpointContext.class, true),
-                Functions.compose(new ChildContextLookup<>(SAMLPeerEntityContext.class, true),
-                        new OutboundMessageContextLookup()));
+        endpointContextLookupStrategy =
+                new ChildContextLookup<>(SAMLEndpointContext.class, true).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class, true).compose(
+                                new OutboundMessageContextLookup()));
     }
     
     /**
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 41ec68f..3b3cae3 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
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -49,8 +51,6 @@ import org.opensaml.saml.saml2.core.SessionIndex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that creates a {@link LogoutRequest} based on an {@link SAML2SPSession} in a
  * {@link LogoutPropagationContext} and sets it as the message returned by
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
index 34cfca8..9887f36 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -35,8 +37,6 @@ import org.opensaml.saml.common.messaging.context.SAMLPeerEntityContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Action that adds an inbound {@link MessageContext} and a {@link SAMLPeerEntityContext} to the
  * {@link ProfileRequestContext} based on the identity of the relying party bound to a {@link SAML2SPSession}
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML1SPSessionCreationStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML1SPSessionCreationStrategy.java
index a36dd26..db25e3c 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML1SPSessionCreationStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML1SPSessionCreationStrategy.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -32,8 +34,6 @@ import net.shibboleth.utilities.java.support.annotation.Duration;
 import net.shibboleth.utilities.java.support.annotation.constraint.Positive;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
-import com.google.common.base.Function;
-
 /**
  * A function to create a {@link SAML1SPSession} based on profile execution state.
  * 
@@ -77,7 +77,6 @@ public class SAML1SPSessionCreationStrategy implements Function<ProfileRequestCo
     }
     
     /** {@inheritDoc} */
-    @Override
     @Nullable public SPSession apply(@Nullable final ProfileRequestContext input) {
         
         final RelyingPartyContext rpCtx = relyingPartyContextLookupStrategy.apply(input);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionCreationStrategy.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionCreationStrategy.java
index 2abe544..c6797c6 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionCreationStrategy.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/SAML2SPSessionCreationStrategy.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.saml.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -40,9 +42,6 @@ import net.shibboleth.utilities.java.support.annotation.constraint.Positive;
 import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * A function to create a {@link SAML2SPSession} based on profile execution state.
  * 
@@ -80,8 +79,7 @@ public class SAML2SPSessionCreationStrategy implements Function<ProfileRequestCo
     public SAML2SPSessionCreationStrategy(@Positive @Duration final long lifetime) {
         sessionLifetime = Constraint.isGreaterThan(0, lifetime, "Lifetime must be greater than 0");
         relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
-        responseLookupStrategy =
-                Functions.compose(new MessageLookup<>(Response.class), new OutboundMessageContextLookup());
+        responseLookupStrategy = new MessageLookup<>(Response.class).compose(new OutboundMessageContextLookup());
     }
 
     /**
@@ -105,7 +103,6 @@ public class SAML2SPSessionCreationStrategy implements Function<ProfileRequestCo
     }
     
     /** {@inheritDoc} */
-    @Override
     @Nullable public SPSession apply(@Nullable final ProfileRequestContext input) {
         
         final RelyingPartyContext rpCtx = relyingPartyContextLookupStrategy.apply(input);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionTokenTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionTokenTest.java
index b649c19..b02b942 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionTokenTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/AddAuthnStatementToAssertionFromInboundAssertionTokenTest.java
@@ -25,6 +25,7 @@ import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileR
 import net.shibboleth.idp.saml.saml2.profile.SAML2ActionTestingSupport;
 import net.shibboleth.idp.saml.saml2.profile.delegation.LibertySSOSContext;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 import net.shibboleth.utilities.java.support.xml.XMLAssertTestNG;
 
 import org.opensaml.core.OpenSAMLInitBaseTestCase;
@@ -41,7 +42,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
@@ -131,10 +131,7 @@ public class AddAuthnStatementToAssertionFromInboundAssertionTokenTest extends O
     
     @Test
     public void testNoAssertionToModify() throws ComponentInitializationException {
-        action.setAssertionLookupStrategy(new Function<ProfileRequestContext, Assertion>() {
-            @Nullable public Assertion apply(@Nullable ProfileRequestContext input) {
-                return null;
-            }});
+        action.setAssertionLookupStrategy(FunctionSupport.constant(null));
         
         action.initialize();
         final Event result = action.execute(rc);
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 76b2798..cdc579b 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
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
-import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
 
 import net.shibboleth.idp.profile.ActionTestingSupport;
@@ -40,6 +39,7 @@ import net.shibboleth.idp.saml.saml2.profile.delegation.impl.DecorateDelegatedAs
 import net.shibboleth.utilities.java.support.collection.Pair;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.UninitializedComponentException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 import net.shibboleth.utilities.java.support.xml.SerializeSupport;
 import net.shibboleth.utilities.java.support.xml.XMLAssertTestNG;
 
@@ -80,7 +80,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import org.w3c.dom.Element;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
@@ -323,12 +322,7 @@ public class DecorateDelegatedAssertionTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEndpointStrategyProducesNull() throws Exception {
         action.setLibertySSOSEndpointURL(null);
-        action.setLibertySSOSEndpointURLLookupStrategy(
-                new Function<Pair<ProfileRequestContext,HttpServletRequest>, String>() {
-                    public String apply(@Nullable Pair<ProfileRequestContext, HttpServletRequest> input) {
-                        return null;
-                    }
-                });
+        action.setLibertySSOSEndpointURLLookupStrategy(FunctionSupport.constant(null));
         
         action.initialize();
         final Event result = action.execute(rc);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicyTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicyTest.java
index eda6ea6..b125f01 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicyTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/EvaluateDelegationPolicyTest.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.saml.saml2.profile.delegation.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nullable;
 
@@ -34,6 +35,7 @@ import net.shibboleth.idp.saml.saml2.profile.delegation.LibertySSOSContext;
 import net.shibboleth.idp.saml.saml2.profile.delegation.impl.EvaluateDelegationPolicy.PolicyMaxChainLengthStrategy;
 import net.shibboleth.idp.saml.xmlobject.DelegationPolicy;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
 import org.opensaml.core.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -52,7 +54,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
@@ -213,10 +214,7 @@ public class EvaluateDelegationPolicyTest extends OpenSAMLInitBaseTestCase {
     
     @Test
     public void testNoDelegatedAssertion() throws ComponentInitializationException {
-        action.setAssertionTokenStrategy(new Function<ProfileRequestContext, Assertion>() {
-            @Nullable public Assertion apply(@Nullable ProfileRequestContext input) {
-                return null;
-            }});
+        action.setAssertionTokenStrategy(FunctionSupport.constant(null));
         
         action.initialize();
         final Event result = action.execute(rc);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContextTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContextTest.java
index 93b4341..d493a1f 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContextTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/impl/PopulateLibertyContextTest.java
@@ -27,6 +27,7 @@ import net.shibboleth.idp.saml.saml2.profile.SAML2ActionTestingSupport;
 import net.shibboleth.idp.saml.saml2.profile.delegation.LibertySSOSContext;
 import net.shibboleth.idp.saml.saml2.profile.delegation.impl.PopulateLibertyContext.TokenStrategy;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 
 import org.opensaml.core.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -43,7 +44,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
@@ -152,10 +152,7 @@ public class PopulateLibertyContextTest extends OpenSAMLInitBaseTestCase {
     
     @Test
     public void testNoResolvedAssertionToken() throws ComponentInitializationException {
-        action.setAssertionTokenStrategy(new Function<ProfileRequestContext, SAML20AssertionToken>() {
-            @Nullable public SAML20AssertionToken apply(@Nullable ProfileRequestContext input) {
-                return null;
-            }});
+        action.setAssertionTokenStrategy(FunctionSupport.constant(null));
         
         action.initialize();
         final Event result = action.execute(rc);
@@ -168,10 +165,7 @@ public class PopulateLibertyContextTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testActivationCondition() throws ComponentInitializationException {
         //This would otherwise cause to fail
-        action.setAssertionTokenStrategy(new Function<ProfileRequestContext, SAML20AssertionToken>() {
-            @Nullable public SAML20AssertionToken apply(@Nullable ProfileRequestContext input) {
-                return null;
-            }});
+        action.setAssertionTokenStrategy(FunctionSupport.constant(null));
         
         action.setActivationCondition(Predicates.alwaysFalse());
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandlerTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandlerTest.java
index cf517d4..6b82cd7 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandlerTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/delegation/messaging/impl/AddSenderHandlerTest.java
@@ -17,14 +17,11 @@
 
 package net.shibboleth.idp.saml.saml2.profile.delegation.messaging.impl;
 
-import javax.annotation.Nullable;
-
 import net.shibboleth.idp.saml.saml2.profile.delegation.impl.LibertyConstants;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 import org.openliberty.xmltooling.soapbinding.Sender;
 import org.opensaml.messaging.context.BaseContext;
-import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.opensaml.soap.SOAPMessagingBaseTestCase;
@@ -33,8 +30,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /**
  *
  */
@@ -73,12 +68,7 @@ public class AddSenderHandlerTest extends SOAPMessagingBaseTestCase {
     public void testInputPresentNonDefaultStrategy() throws ComponentInitializationException, MessageHandlerException {
         getMessageContext().getSubcontext(TestContext.class, true).value="urn:test:abc123";
         
-        handler.setProviderIdLookupFunction(new Function<MessageContext, String>() {
-            @Nullable public String apply(@Nullable MessageContext input) {
-                return input.getSubcontext(TestContext.class).value;
-            }
-        });
-        
+        handler.setProviderIdLookupFunction(mc -> mc.getSubcontext(TestContext.class).value);
         handler.initialize();
         handler.invoke(getMessageContext());
         
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/CanonicalUsernameLookupStrategy.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/CanonicalUsernameLookupStrategy.java
index cfc810a..cf7a4fc 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/CanonicalUsernameLookupStrategy.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/CanonicalUsernameLookupStrategy.java
@@ -17,9 +17,9 @@
 
 package net.shibboleth.idp.session.context.navigate;
 
-import org.opensaml.profile.context.ProfileRequestContext;
+import java.util.function.Function;
 
-import com.google.common.base.Function;
+import org.opensaml.profile.context.ProfileRequestContext;
 
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.session.context.SessionContext;
@@ -31,7 +31,6 @@ import net.shibboleth.idp.session.context.SessionContext;
 public class CanonicalUsernameLookupStrategy implements Function<ProfileRequestContext, String> {
 
     /** {@inheritDoc} */
-    @Override
     public String apply(final ProfileRequestContext input) {
         
         if (input != null) {
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextIDLookupFunction.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextIDLookupFunction.java
index 56a83be..e80be49 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextIDLookupFunction.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextIDLookupFunction.java
@@ -27,7 +27,6 @@ import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 public class SessionContextIDLookupFunction implements ContextDataLookupFunction<SessionContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final SessionContext input) {
         
         if (input != null && input.getIdPSession() != null) {
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextPrincipalLookupFunction.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextPrincipalLookupFunction.java
index 197b6d5..6cd8f47 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextPrincipalLookupFunction.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/context/navigate/SessionContextPrincipalLookupFunction.java
@@ -27,7 +27,6 @@ import org.opensaml.messaging.context.navigate.ContextDataLookupFunction;
 public class SessionContextPrincipalLookupFunction implements ContextDataLookupFunction<SessionContext,String> {
 
     /** {@inheritDoc} */
-    @Override
     @Nullable public String apply(@Nullable final SessionContext input) {
         
         if (input != null && input.getIdPSession() != null) {
diff --git a/idp-session-api/src/main/java/net/shibboleth/idp/session/logic/LogoutPropagationFlowDescriptorSelector.java b/idp-session-api/src/main/java/net/shibboleth/idp/session/logic/LogoutPropagationFlowDescriptorSelector.java
index ac52859..7dd51f7 100644
--- a/idp-session-api/src/main/java/net/shibboleth/idp/session/logic/LogoutPropagationFlowDescriptorSelector.java
+++ b/idp-session-api/src/main/java/net/shibboleth/idp/session/logic/LogoutPropagationFlowDescriptorSelector.java
@@ -19,11 +19,11 @@ package net.shibboleth.idp.session.logic;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -36,7 +36,7 @@ import net.shibboleth.utilities.java.support.logic.Constraint;
 /**
  * Selection function to retrieve the logout propagation flow descriptor that is suitable for a given {@link SPSession}.
  */
-public class LogoutPropagationFlowDescriptorSelector implements Function<SPSession, LogoutPropagationFlowDescriptor> {
+public class LogoutPropagationFlowDescriptorSelector implements Function<SPSession,LogoutPropagationFlowDescriptor> {
 
     /** List of available flows. */
     private final List<LogoutPropagationFlowDescriptor> availableFlows;
@@ -54,8 +54,7 @@ public class LogoutPropagationFlowDescriptorSelector implements Function<SPSessi
     }
 
     /** {@inheritDoc} */
-    @Override
-    @Nullable public LogoutPropagationFlowDescriptor apply(@Nonnull final SPSession input) {
+    @Nullable public LogoutPropagationFlowDescriptor apply(@Nullable final SPSession input) {
         for (final LogoutPropagationFlowDescriptor flowDescriptor : availableFlows) {
             if (flowDescriptor.getSessionType().isInstance(input)) {
                 return flowDescriptor;
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/BasicSPSessionCreationStrategy.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/BasicSPSessionCreationStrategy.java
index 7eb03f1..a6eac10 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/BasicSPSessionCreationStrategy.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/BasicSPSessionCreationStrategy.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -32,8 +34,6 @@ import net.shibboleth.utilities.java.support.annotation.Duration;
 import net.shibboleth.utilities.java.support.annotation.constraint.Positive;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
-import com.google.common.base.Function;
-
 /**
  * A function to create a {@link BasicSPSession} based on profile execution state.
  * 
@@ -43,7 +43,7 @@ import com.google.common.base.Function;
  * in the {@link net.shibboleth.idp.authn.context.AuthenticationContext}. The session has a 
  * creation time based on the time of execution, and the expiration is based on a configurable lifetime.</p> 
  */
-public class BasicSPSessionCreationStrategy implements Function<ProfileRequestContext, SPSession> {
+public class BasicSPSessionCreationStrategy implements Function<ProfileRequestContext,SPSession> {
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(BasicSPSessionCreationStrategy.class);
@@ -76,7 +76,6 @@ public class BasicSPSessionCreationStrategy implements Function<ProfileRequestCo
     }
     
     /** {@inheritDoc} */
-    @Override
     @Nullable public SPSession apply(@Nullable final ProfileRequestContext input) {
         
         final RelyingPartyContext rpCtx = relyingPartyContextLookupStrategy.apply(input);
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DestroySessions.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DestroySessions.java
index 6a82ddf..3de9f12 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DestroySessions.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DestroySessions.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -38,7 +40,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
index cd1689f..5b8a20c 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.session.impl;
 
 import java.util.Collections;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -42,7 +43,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 
 /**
  * An authentication action that checks for a mismatch between an existing session's identity and
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ExtractActiveAuthenticationResults.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ExtractActiveAuthenticationResults.java
index 77f1595..88fc81a 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ExtractActiveAuthenticationResults.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ExtractActiveAuthenticationResults.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.session.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -37,8 +38,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * An authentication action that populates a {@link AuthenticationContext} with the active
  * {@link AuthenticationResult} objects found in a {@link SessionContext} that is a direct
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/LogoutStatusStrategyFunction.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/LogoutStatusStrategyFunction.java
index d0d1f6e..351f692 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/LogoutStatusStrategyFunction.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/LogoutStatusStrategyFunction.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.session.impl;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
@@ -28,8 +29,6 @@ import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.saml.saml2.core.StatusCode;
 
-import com.google.common.base.Function;
-
 import net.shibboleth.idp.session.context.LogoutContext;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
@@ -63,7 +62,7 @@ public class LogoutStatusStrategyFunction implements Function<ProfileRequestCont
     }
 
     /** {@inheritDoc} */
-    public @Nullable List<String> apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public List<String> apply(@Nullable final ProfileRequestContext input) {
         
         final LogoutContext logoutCtx = logoutContextLookupStrategy.apply(input);
         if (logoutCtx != null) {
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 b427b10..6dbdcbf 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
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.session.impl;
 
 import java.io.IOException;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -44,7 +45,6 @@ import org.opensaml.storage.StorageSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import org.springframework.webflow.execution.RequestContext;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
index 722e335..c458bb6 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.session.impl;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -52,8 +53,6 @@ import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * Profile action that populates a {@link MultiRelyingPartyContext} with the relying party
  * information from a {@link LogoutContext}, and extends each {@link RelyingPartyContext}
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateSessionContext.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateSessionContext.java
index 9bb01fe..7144f5f 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateSessionContext.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateSessionContext.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.servlet.http.HttpServletRequest;
 
@@ -40,8 +43,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -75,12 +76,7 @@ public class PopulateSessionContext extends AbstractProfileAction {
         
         sessionContextCreationStrategy = new ChildContextLookup<>(SessionContext.class, true);
         
-        sessionResolverCriteriaStrategy = new Function<ProfileRequestContext,CriteriaSet>() {
-            @Override
-            public CriteriaSet apply(final ProfileRequestContext input) {
-                return new CriteriaSet(new HttpServletRequestCriterion());
-            }            
-        };
+        sessionResolverCriteriaStrategy = prc -> new CriteriaSet(new HttpServletRequestCriterion());
     }
     
     /**
@@ -158,7 +154,7 @@ public class PopulateSessionContext extends AbstractProfileAction {
                 return;
             }
             
-            if (checkAddressCondition.apply(profileRequestContext)) {
+            if (checkAddressCondition.test(profileRequestContext)) {
                 final HttpServletRequest request = getHttpServletRequest();
                 if (request != null && request.getRemoteAddr() != null) {
                     if (!session.checkAddress(request.getRemoteAddr())) {
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ProcessLogout.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ProcessLogout.java
index 64f879e..73f997d 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ProcessLogout.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/ProcessLogout.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+import java.util.function.Predicate;
+
 import javax.annotation.Nonnull;
 import javax.servlet.http.HttpServletRequest;
 
@@ -43,8 +46,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
 /**
@@ -91,12 +92,7 @@ public class ProcessLogout extends AbstractProfileAction {
         sessionContextCreationStrategy = new ChildContextLookup<>(SessionContext.class, true);
         logoutContextCreationStrategy = new ChildContextLookup<>(LogoutContext.class, true);
         
-        sessionResolverCriteriaStrategy = new Function<ProfileRequestContext,CriteriaSet>() {
-            @Override
-            public CriteriaSet apply(final ProfileRequestContext input) {
-                return new CriteriaSet(new HttpServletRequestCriterion());
-            }            
-        };
+        sessionResolverCriteriaStrategy = prc -> new CriteriaSet(new HttpServletRequestCriterion());
     }
     
     /**
@@ -199,7 +195,7 @@ public class ProcessLogout extends AbstractProfileAction {
                 return;
             }
             
-            if (checkAddressCondition.apply(profileRequestContext)) {
+            if (checkAddressCondition.test(profileRequestContext)) {
                 final HttpServletRequest request = getHttpServletRequest();
                 if (request != null && request.getRemoteAddr() != null) {
                     try {
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/RestoreProfileRequestContextTree.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/RestoreProfileRequestContextTree.java
index b5d2f31..866141f 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/RestoreProfileRequestContextTree.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/RestoreProfileRequestContextTree.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.session.impl;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.ActionSupport;
 import net.shibboleth.idp.profile.context.AuditContext;
@@ -32,6 +31,8 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveLogoutContext.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveLogoutContext.java
index c14eed0..3522c48 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveLogoutContext.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveLogoutContext.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.session.impl;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.ActionSupport;
 import net.shibboleth.idp.session.context.LogoutContext;
@@ -32,6 +31,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.RequestContext;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveProfileRequestContextTree.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveProfileRequestContextTree.java
index a84b49d..481bfca 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveProfileRequestContextTree.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SaveProfileRequestContextTree.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.session.impl;
 
-import com.google.common.base.Function;
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.ActionSupport;
 import net.shibboleth.idp.profile.context.AuditContext;
@@ -33,6 +32,8 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SelectLogoutPropagationFlow.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SelectLogoutPropagationFlow.java
index e77ed54..5a43525 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SelectLogoutPropagationFlow.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/SelectLogoutPropagationFlow.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
@@ -32,8 +34,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-
 /**
  * A profile action that selects a logout propagation flow to invoke.
  * 
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
index 648303d..55242c3 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResult.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -39,7 +41,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSession.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSession.java
index 66e803a..e06625c 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSession.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSession.java
@@ -17,6 +17,8 @@
 
 package net.shibboleth.idp.session.impl;
 
+import java.util.function.Function;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -38,7 +40,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 
 /**
diff --git a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
index 345303a..7f845e8 100644
--- a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
+++ b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
@@ -18,6 +18,7 @@
 package net.shibboleth.idp.session.impl;
 
 import java.util.Collections;
+import java.util.function.Function;
 
 import net.shibboleth.idp.profile.ActionTestingSupport;
 import net.shibboleth.idp.profile.RequestContextBuilder;
@@ -29,6 +30,7 @@ import net.shibboleth.idp.session.SPSessionSerializerRegistry;
 import net.shibboleth.idp.session.SessionException;
 import net.shibboleth.idp.session.context.SessionContext;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.logic.FunctionSupport;
 import net.shibboleth.utilities.java.support.net.HttpServletRequestResponseContext;
 
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -41,8 +43,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-
 /** {@link UpdateSessionWithSPSession} unit test. */
 public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
     
@@ -75,7 +75,7 @@ public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
     
     @Test public void testNoSession() throws ComponentInitializationException {
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
-        action.setSPSessionCreationStrategy(new NullStrategy());
+        action.setSPSessionCreationStrategy(FunctionSupport.constant(null));
         action.initialize();
         
         final Event event = action.execute(src);
@@ -89,7 +89,7 @@ public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
         final IdPSession session = sessionManager.createSession("joe");
         prc.getSubcontext(SessionContext.class, true).setIdPSession(session);
         
-        action.setSPSessionCreationStrategy(new NullStrategy());
+        action.setSPSessionCreationStrategy(FunctionSupport.constant(null));
         action.initialize();
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -130,21 +130,10 @@ public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
         }
         
         /** {@inheritDoc} */
-        @Override
         public SPSession apply(ProfileRequestContext input) {
             return new BasicSPSession("https://sp.example.org", creationTime, expirationTime);
         }
         
     }
     
-    /** Returns nothing. */
-    private class NullStrategy implements Function<ProfileRequestContext, SPSession> {
-        
-        /** {@inheritDoc} */
-        @Override
-        public SPSession apply(ProfileRequestContext input) {
-            return null;
-        }
-        
-    }
 }
\ No newline at end of file
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 9907335..107f0a7 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
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Locale;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -50,8 +51,6 @@ import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
 
@@ -98,9 +97,8 @@ public class SetRPUIInformation extends AbstractProfileAction {
         metadataContextLookupStrategy = new SAMLMetadataContextLookupFunction();
 
         rpUIContextCreateStrategy =
-                Functions.compose(new ChildContextLookup<>(RelyingPartyUIContext.class, true),
-                        new ChildContextLookup<ProfileRequestContext, AuthenticationContext>(
-                                AuthenticationContext.class, true));
+                new ChildContextLookup<>(RelyingPartyUIContext.class, true).compose(
+                        new ChildContextLookup<>(AuthenticationContext.class, true));
     }
 
     /**
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
index 409ead6..e02f05d 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/taglib/ServiceTagSupport.java
@@ -19,6 +19,7 @@ package net.shibboleth.idp.ui.taglib;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -34,9 +35,6 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
 /**
  * Display the serviceName.
  * 
@@ -48,12 +46,12 @@ public class ServiceTagSupport extends BodyTagSupport {
     private static final long serialVersionUID = 4405207268569727209L;
 
     /** Class logger. */
-    private static Logger log = LoggerFactory.getLogger(ServiceTagSupport.class);
+    @Nonnull private static Logger log = LoggerFactory.getLogger(ServiceTagSupport.class);
 
     /** Strategy function for access to {@link RelyingPartyUIContext} for input to resolver. */
-    @Nonnull private static Function<ProfileRequestContext, RelyingPartyUIContext> uiContextLookupStrategy = Functions
-            .compose(new ChildContextLookup<AuthenticationContext, RelyingPartyUIContext>(RelyingPartyUIContext.class),
-                    new ChildContextLookup<ProfileRequestContext, AuthenticationContext>(AuthenticationContext.class));
+    @Nonnull private static Function<ProfileRequestContext, RelyingPartyUIContext> uiContextLookupStrategy =
+            new ChildContextLookup<>(RelyingPartyUIContext.class).compose(
+                    new ChildContextLookup<>(AuthenticationContext.class));
 
     /** Bean storage. class reference */
     @Nullable private String cssClass;

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


More information about the commits mailing list