[java-identity-provider] branch main updated: Replace Collections and Arrays usage.

Scott Cantor cantor.2 at osu.edu
Thu Apr 20 14:26:27 UTC 2023


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

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

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

The following commit(s) were added to refs/heads/main by this push:
     new b16fff3de Replace Collections and Arrays usage.
b16fff3de is described below

commit b16fff3de1d3aeb525260004b7cb87110fe39a3a
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Apr 20 10:26:23 2023 -0400

    Replace Collections and Arrays usage.
---
 .../shibboleth/idp/module/AbstractIdPModule.java   | 16 ++++----
 .../net/shibboleth/idp/plugin/IdPPluginTest.java   |  7 ++--
 .../java/net/shibboleth/idp/plugin/TestPlugin.java |  6 +--
 .../idp/admin/impl/DoStorageOperation.java         |  4 +-
 .../shibboleth/idp/authn/AuthenticationResult.java |  6 +--
 .../AuthenticationFlowsLookupFunction.java         | 11 +++--
 .../PostAuthenticationFlowsLookupFunction.java     | 11 +++--
 .../principal/GenericPrincipalSerializer.java      |  3 +-
 .../SubjectDerivedAttributeValuesFunction.java     |  7 ++--
 .../impl/SubjectDerivedAttributesFunction.java     |  6 +--
 .../idp/authn/duo/impl/ValidateDuoWebResponse.java |  6 +--
 .../idp/authn/impl/DoLockoutManagerOperation.java  |  4 +-
 .../authn/impl/PopulateAuthenticationContext.java  |  3 +-
 .../authn/impl/ValidateExternalAuthentication.java | 14 ++++---
 .../idp/authn/impl/ValidateFunctionResult.java     |  8 ++--
 .../shibboleth/idp/authn/impl/X509ProxyFilter.java |  4 +-
 .../impl/DoRevocationCacheOperation.java           |  4 +-
 .../context/impl/AuthenticationContextTest.java    | 13 ++++--
 .../SubjectDerivedAttributeValuesFunctionTest.java |  7 ++--
 ...ttributeSourcedSubjectCanonicalizationTest.java | 25 ++++++-----
 .../BaseMultiFactorAuthenticationContextTest.java  |  4 +-
 .../impl/HTPasswdCredentialValidatorTest.java      | 18 ++++----
 .../InitializeRequestedPrincipalContextTest.java   |  8 ++--
 .../authn/impl/JAASCredentialValidatorTest.java    | 20 +++++----
 .../authn/impl/LDAPCredentialValidatorTest.java    | 16 ++++----
 .../impl/PopulateAuthenticationContextTest.java    |  7 +---
 ...pulateMultiFactorAuthenticationContextTest.java | 10 ++---
 .../authn/impl/SelectAuthenticationFlowTest.java   | 48 +++++++++++-----------
 .../idp/authn/impl/ValidateCredentialsTest.java    | 18 ++++----
 .../authn/impl/ValidateUserAgentAddressTest.java   | 18 ++++----
 .../X509CertificateCredentialValidatorTest.java    |  5 ++-
 ...RequestedPrincipalContextPrincipalEvalTest.java | 12 +++---
 .../impl/AttributeRevocationConditionTest.java     | 18 ++++----
 .../idp/cas/protocol/TicketValidationResponse.java |  6 +--
 .../PrepareTicketValidationResponseAction.java     |  8 ++--
 .../cas/proxy/impl/HttpClientProxyValidator.java   |  8 ++--
 .../impl/CASDateTimeAttributeTranscoderTest.java   |  3 +-
 .../CASScopedStringAttributeTranscoderTest.java    | 10 ++---
 .../impl/CASStringAttributeTranscoderTest.java     | 10 ++---
 .../proxy/impl/HttpClientProxyValidatorTest.java   |  4 +-
 .../service/impl/MetadataServiceRegistryTest.java  |  5 +--
 .../idp/test/flows/cas/LoginFlowTest.java          |  6 +--
 .../impl/CurrentConsentIdsAuditExtractor.java      |  6 +--
 .../CurrentConsentIsApprovedAuditExtractor.java    |  4 +-
 .../impl/CurrentConsentValuesAuditExtractor.java   |  6 +--
 .../logic/impl/MessageSourceConsentFunction.java   |  6 +--
 .../impl/CurrentConsentIdsAuditExtractorTest.java  |  9 ++--
 ...CurrentConsentIsApprovedAuditExtractorTest.java |  8 ++--
 .../CurrentConsentValuesAuditExtractorTest.java    |  8 ++--
 .../context/impl/AttributeReleaseContextTest.java  |  6 +--
 .../impl/PopulateAttributeReleaseContextTest.java  |  9 ++--
 .../flow/storage/impl/RevokeConsentTest.java       |  4 +-
 .../idp/consent/impl/ConsentTestingSupport.java    |  7 ++--
 .../impl/AttributeValueLookupFunctionTest.java     | 10 ++---
 .../impl/AttributeValuesHashFunctionTest.java      | 15 ++++---
 .../impl/PreferExplicitOrderComparatorTest.java    |  8 ++--
 .../storage/impl/CollectionSerializerTest.java     |  6 +--
 ...IdPPropertiesApplicationContextInitializer.java |  4 +-
 .../idp/installer/InstallerPropertiesImpl.java     |  4 +-
 .../net/shibboleth/idp/installer/V4Install.java    |  3 +-
 .../installer/impl/CurrentInstallStateImpl.java    |  7 ++--
 .../metadata/impl/MetadataGeneratorImpl.java       | 17 ++++----
 .../idp/installer/plugin/impl/PluginInstaller.java |  4 +-
 .../installer/plugin/impl/PluginInstallerCLI.java  |  3 +-
 .../idp/installer/plugin/impl/TrustStore.java      |  6 +--
 .../installer/plugin/impl/PluginInstallerTest.java |  4 +-
 .../idp/installer/plugin/impl/PluginStateTest.java |  6 +--
 .../idp/installer/plugin/impl/TestModule.java      | 14 +++----
 .../idp/installer/plugin/impl/TestPlugin.java      |  6 +--
 .../navigate/InboundFlowsLookupFunction.java       |  8 ++--
 .../navigate/OutboundFlowsLookupFunction.java      |  8 ++--
 .../idp/profile/impl/FilterAttributes.java         | 32 ++++++++-------
 .../idp/profile/impl/ResolveAttributes.java        |  4 +-
 .../audit/impl/PopulateAuditContextTest.java       | 12 +++---
 .../idp/profile/audit/impl/WriteAuditLogTest.java  | 20 ++++-----
 .../impl/SelectProfileConfigurationTest.java       | 11 +++--
 .../PopulateProfileInterceptorContextTest.java     |  9 +---
 77 files changed, 354 insertions(+), 367 deletions(-)

diff --git a/idp-admin-api/src/main/java/net/shibboleth/idp/module/AbstractIdPModule.java b/idp-admin-api/src/main/java/net/shibboleth/idp/module/AbstractIdPModule.java
index 31194edb2..89413ffdf 100644
--- a/idp-admin-api/src/main/java/net/shibboleth/idp/module/AbstractIdPModule.java
+++ b/idp-admin-api/src/main/java/net/shibboleth/idp/module/AbstractIdPModule.java
@@ -32,9 +32,7 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -71,7 +69,7 @@ public abstract class AbstractIdPModule implements IdPModule {
     @Nonnull private Logger log = LoggerFactory.getLogger(AbstractIdPModule.class);
     
     /** Module resources. */
-    @Nonnull @NonnullElements private Collection<BasicModuleResource> moduleResources;
+    @Nonnull private Collection<ModuleResource> moduleResources;
     
     /** Constructor. */
     public AbstractIdPModule() {
@@ -79,8 +77,8 @@ public abstract class AbstractIdPModule implements IdPModule {
     }
     
     /** {@inheritDoc} */
-    @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<ModuleResource> getResources() {
-        return List.copyOf(moduleResources);
+    @Nonnull @NotLive @Unmodifiable public Collection<ModuleResource> getResources() {
+        return moduleResources;
     }
     
     /**
@@ -90,9 +88,9 @@ public abstract class AbstractIdPModule implements IdPModule {
      */
     public void setResources(@Nullable @NonnullElements final Collection<BasicModuleResource> resources) {
         if (resources != null) {
-            moduleResources = List.copyOf(resources);
+            moduleResources = CollectionSupport.copyToList(resources);
         } else {
-            moduleResources = Collections.emptyList();
+            moduleResources = CollectionSupport.emptyList();
         }
     }
     
@@ -164,7 +162,7 @@ public abstract class AbstractIdPModule implements IdPModule {
                 results.put(resource, ((BasicModuleResource) resource).enable(moduleContext));
             }
         } else {
-            results = Collections.emptyMap();
+            results = CollectionSupport.emptyMap();
         }
         
         log.debug("Module {} enabled", getId());
@@ -190,7 +188,7 @@ public abstract class AbstractIdPModule implements IdPModule {
                 results.put(resource, ((BasicModuleResource) resource).disable(moduleContext, clean));
             }
         } else {
-            results = Collections.emptyMap();
+            results = CollectionSupport.emptyMap();
         }
         
         log.debug("Module {} disabled", getId());
diff --git a/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/IdPPluginTest.java b/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/IdPPluginTest.java
index 8aed7d902..e6181dd65 100644
--- a/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/IdPPluginTest.java
+++ b/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/IdPPluginTest.java
@@ -18,7 +18,6 @@ package net.shibboleth.idp.plugin;
 
 import java.io.IOException;
 import java.net.URL;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.ServiceLoader;
@@ -31,10 +30,12 @@ import org.testng.annotations.Test;
 import net.shibboleth.idp.module.IdPModule;
 import net.shibboleth.idp.module.ModuleException;
 import net.shibboleth.idp.module.TestModule;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  * Unit tests exercising plugin code.
  */
+ at SuppressWarnings("javadoc")
 public class IdPPluginTest {
     
     private IdPPlugin testPlugin;
@@ -59,8 +60,8 @@ public class IdPPluginTest {
         Assert.assertEquals(urls.get(1).toString(), "https://backup.example.org/plugin");
         
         final IdPModule test = new TestModule();
-        Assert.assertEquals(testPlugin.getEnableOnInstall(), Collections.singleton(test));
-        Assert.assertEquals(testPlugin.getDisableOnRemoval(), Collections.singleton(test));
+        Assert.assertEquals(testPlugin.getEnableOnInstall(), CollectionSupport.singleton(test));
+        Assert.assertEquals(testPlugin.getDisableOnRemoval(), CollectionSupport.singleton(test));
     }
 
 }
\ No newline at end of file
diff --git a/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/TestPlugin.java b/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/TestPlugin.java
index ed1f12fe2..10035d8bd 100644
--- a/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/TestPlugin.java
+++ b/idp-admin-api/src/test/java/net/shibboleth/idp/plugin/TestPlugin.java
@@ -18,11 +18,11 @@
 package net.shibboleth.idp.plugin;
 
 import java.io.IOException;
-import java.util.Collections;
 
 import net.shibboleth.idp.module.IdPModule;
 import net.shibboleth.idp.module.ModuleException;
 import net.shibboleth.idp.module.TestModule;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  * Test plugin for unit test.
@@ -40,8 +40,8 @@ public class TestPlugin extends PropertyDrivenIdPPlugin {
         
         try {
             final IdPModule module = new TestModule();
-            setEnableOnInstall(Collections.singleton(module));
-            setDisableOnRemoval(Collections.singleton(module));
+            setEnableOnInstall(CollectionSupport.singleton(module));
+            setDisableOnRemoval(CollectionSupport.singleton(module));
         } catch (final IOException | ModuleException e) {
             throw new PluginException(e);
         }
diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
index a14d39b75..acce008ee 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/DoStorageOperation.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.admin.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -46,6 +45,7 @@ import net.shibboleth.idp.profile.context.SpringRequestContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -427,7 +427,7 @@ public class DoStorageOperation extends AbstractProfileAction {
         
         final Error e = new Error();
         final Errors errors = new Errors();
-        errors.setErrors(Collections.singletonList(e));
+        errors.setErrors(CollectionSupport.singletonList(e));
         e.setStatus(Integer.toString(status));
         e.setTitle(title);
         e.setDetail(detail);
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationResult.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationResult.java
index c8b9868de..a7003229a 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationResult.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AuthenticationResult.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.authn;
 
 import java.security.Principal;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -42,6 +41,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -114,8 +114,8 @@ public class AuthenticationResult implements PrincipalSupportingComponent, Predi
      */
     public AuthenticationResult(@Nonnull @NotEmpty final String flowId, @Nonnull final Principal principal) {
         this(flowId, new Subject(false,
-                Collections.singleton(Constraint.isNotNull(principal, "Principal cannot be null")),
-                Collections.emptySet(), Collections.emptySet()));
+                CollectionSupport.singleton(Constraint.isNotNull(principal, "Principal cannot be null")),
+                CollectionSupport.emptySet(), CollectionSupport.emptySet()));
     }
     
     /**
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/AuthenticationFlowsLookupFunction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/AuthenticationFlowsLookupFunction.java
index b5e4625db..d2c05f1c5 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/AuthenticationFlowsLookupFunction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/AuthenticationFlowsLookupFunction.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.authn.config.navigate;
 
 import java.util.Collection;
-import java.util.Collections;
 
 import javax.annotation.Nullable;
 
@@ -26,9 +25,9 @@ import net.shibboleth.idp.authn.config.AuthenticationProfileConfiguration;
 import net.shibboleth.profile.config.ProfileConfiguration;
 import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.profile.context.navigate.AbstractRelyingPartyLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -43,17 +42,17 @@ public class AuthenticationFlowsLookupFunction extends AbstractRelyingPartyLooku
 
     /** {@inheritDoc} */
     @Override
-    @Nullable @NonnullElements @NotLive @Unmodifiable public Collection<String> apply(
+    @Nullable @NotLive @Unmodifiable public Collection<String> apply(
             @Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
-            if (pc != null && pc instanceof AuthenticationProfileConfiguration) {
-                return ((AuthenticationProfileConfiguration) pc).getAuthenticationFlows(input);
+            if (pc instanceof AuthenticationProfileConfiguration apc) {
+                return apc.getAuthenticationFlows(input);
             }
         }
         
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/PostAuthenticationFlowsLookupFunction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/PostAuthenticationFlowsLookupFunction.java
index 6a32637b6..45ca5e748 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/PostAuthenticationFlowsLookupFunction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/config/navigate/PostAuthenticationFlowsLookupFunction.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.authn.config.navigate;
 
 import java.util.Collection;
-import java.util.Collections;
 
 import javax.annotation.Nullable;
 
@@ -26,9 +25,9 @@ import net.shibboleth.idp.authn.config.AuthenticationProfileConfiguration;
 import net.shibboleth.profile.config.ProfileConfiguration;
 import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.profile.context.navigate.AbstractRelyingPartyLookupFunction;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -43,17 +42,17 @@ public class PostAuthenticationFlowsLookupFunction extends AbstractRelyingPartyL
 
     /** {@inheritDoc} */
     @Override
-    @Nullable @NonnullElements @NotLive @Unmodifiable public Collection<String> apply(
+    @Nullable @NotLive @Unmodifiable public Collection<String> apply(
             @Nullable final ProfileRequestContext input) {
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
-            if (pc != null && pc instanceof AuthenticationProfileConfiguration) {
-                return ((AuthenticationProfileConfiguration) pc).getPostAuthenticationFlows(input);
+            if (pc instanceof AuthenticationProfileConfiguration apc) {
+                return apc.getPostAuthenticationFlows(input);
             }
         }
         
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/GenericPrincipalSerializer.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/GenericPrincipalSerializer.java
index 2dcb8f0d8..eedcfadd3 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/GenericPrincipalSerializer.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/principal/GenericPrincipalSerializer.java
@@ -87,7 +87,8 @@ public class GenericPrincipalSerializer extends AbstractPrincipalSerializer<Stri
         final BiMap<String,Integer> s = ImmutableBiMap.of();
         assert s!=null;
         symbolics = s;
-        final Set<Class<? extends Principal>> cpt = Collections.synchronizedSet(new HashSet<Class<? extends Principal>>());
+        final Set<Class<? extends Principal>> cpt =
+                Collections.synchronizedSet(new HashSet<Class<? extends Principal>>());
         assert cpt!=null;
         compatiblePrincipalTypes = cpt;
     }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunction.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunction.java
index c4180bdf8..d36e31295 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunction.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunction.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.authn.context.impl;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 
@@ -37,10 +36,12 @@ import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.authn.context.SubjectContext;
 import net.shibboleth.idp.authn.context.navigate.SubjectCanonicalizationContextSubjectLookupFunction;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * 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}.
@@ -138,7 +139,7 @@ public class SubjectDerivedAttributeValuesFunction extends AbstractIdentifiableI
     /** {@inheritDoc} */
     @Nullable public List<IdPAttributeValue> apply(@Nullable final ProfileRequestContext prc) {
         
-        Collection<Subject> subjects = Collections.emptyList();
+        Collection<Subject> subjects = CollectionSupport.emptyList();
         
         if (subjectLookupStrategy != null) {
             final Subject subject = subjectLookupStrategy.apply(prc);
@@ -146,7 +147,7 @@ public class SubjectDerivedAttributeValuesFunction extends AbstractIdentifiableI
                 log.debug("{} No Subject returned from lookup, no attribute resolved", getLogPrefix());
                 return null;
             }
-            subjects = Collections.singletonList(subject);
+            subjects = CollectionSupport.singletonList(subject);
         } else {
             final SubjectContext cs = scLookupStrategy.apply(prc);
             if (cs == null || cs.getSubjects().isEmpty()) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributesFunction.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributesFunction.java
index 2e059249f..a560a211c 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributesFunction.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributesFunction.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.authn.context.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -37,6 +36,7 @@ import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.authn.context.SubjectContext;
 import net.shibboleth.idp.authn.context.navigate.SubjectCanonicalizationContextSubjectLookupFunction;
 import net.shibboleth.idp.authn.principal.IdPAttributePrincipal;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -127,7 +127,7 @@ public class SubjectDerivedAttributesFunction extends AbstractIdentifiableInitia
     /** {@inheritDoc} */
     @Nullable public List<IdPAttribute> apply(@Nullable final ProfileRequestContext prc) {
         
-        Collection<Subject> subjects = Collections.emptyList();
+        Collection<Subject> subjects = CollectionSupport.emptyList();
         
         if (subjectLookupStrategy != null) {
             final Subject subject = subjectLookupStrategy.apply(prc);
@@ -135,7 +135,7 @@ public class SubjectDerivedAttributesFunction extends AbstractIdentifiableInitia
                 log.debug("{} No Subject returned from lookup, no attribute resolved", getLogPrefix());
                 return null;
             }
-            subjects = Collections.singletonList(subject);
+            subjects = CollectionSupport.singletonList(subject);
         } else {
             final SubjectContext cs = scLookupStrategy.apply(prc);
             if (cs == null || cs.getSubjects().isEmpty()) {
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 f950993aa..8525c2203 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
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.security.Principal;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
@@ -48,6 +47,7 @@ import net.shibboleth.idp.profile.IdPAuditFields;
 import net.shibboleth.idp.session.context.navigate.CanonicalUsernameLookupStrategy;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.FunctionSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -240,10 +240,10 @@ public class ValidateDuoWebResponse extends AbstractAuditingValidationAction {
                 return Map.of(AuthnAuditFields.DUO_CLIENT_ID, duoIntegration.getIntegrationKey(),
                         IdPAuditFields.USERNAME, username);
             } else {
-                return Collections.singletonMap(IdPAuditFields.USERNAME, username);
+                return CollectionSupport.singletonMap(IdPAuditFields.USERNAME, username);
             }
         } else if (duoIntegration != null) {
-            return Collections.singletonMap(AuthnAuditFields.DUO_CLIENT_ID, duoIntegration.getIntegrationKey());
+            return CollectionSupport.singletonMap(AuthnAuditFields.DUO_CLIENT_ID, duoIntegration.getIntegrationKey());
         }
         
         return super.getAuditFields(profileRequestContext);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
index 02ec35054..9b442d61d 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -46,6 +45,7 @@ import net.shibboleth.idp.profile.context.SpringRequestContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -291,7 +291,7 @@ public class DoLockoutManagerOperation extends AbstractProfileAction {
         
         final Error e = new Error();
         final Errors errors = new Errors();
-        errors.setErrors(Collections.singletonList(e));
+        errors.setErrors(CollectionSupport.singletonList(e));
         e.setStatus(Integer.toString(status));
         e.setTitle(title);
         e.setDetail(detail);
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 5202498a7..104de559d 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
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
@@ -76,7 +75,7 @@ public class PopulateAuthenticationContext extends AbstractAuthenticationAction
     /** Constructor. */
     public PopulateAuthenticationContext() {
         availableFlows = CollectionSupport.emptyList();
-        potentialFlowsLookupStrategy = FunctionSupport.constant(Collections.emptyList());
+        potentialFlowsLookupStrategy = FunctionSupport.constant(CollectionSupport.emptyList());
         activeFlowsLookupStrategy = new AuthenticationFlowsLookupFunction();
     }
     
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
index 9c8436192..362f3b020 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
@@ -17,8 +17,8 @@
 
 package net.shibboleth.idp.authn.impl;
 
+import java.security.Principal;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
@@ -189,13 +189,15 @@ public class ValidateExternalAuthentication extends AbstractAuditingValidationAc
         } else if (extContext.getPrincipal() != null) {
             log.info("{} External authentication succeeded for Principal: {}", getLogPrefix(),
                     extContext.getPrincipal());
-            extContext.setSubject(new Subject(false, Collections.singleton(extContext.getPrincipal()),
-                    Collections.emptySet(), Collections.emptySet()));
+            final Principal p = extContext.getPrincipal();
+            assert p != null;
+            extContext.setSubject(new Subject(false, CollectionSupport.singleton(p), CollectionSupport.emptySet(),
+                    CollectionSupport.emptySet()));
         } else if (principalName!= null) {
             log.info("{} External authentication succeeded for user: {}", getLogPrefix(), principalName);
             extContext.setSubject(new Subject(false,
-                    Collections.singleton(new UsernamePrincipal(principalName)),
-                    Collections.emptySet(), Collections.emptySet()));
+                    CollectionSupport.singleton(new UsernamePrincipal(principalName)),
+                    CollectionSupport.emptySet(), CollectionSupport.emptySet()));
         } else {
             log.info("{} External authentication failed, no user identity or error information returned",
                     getLogPrefix());
@@ -323,7 +325,7 @@ public class ValidateExternalAuthentication extends AbstractAuditingValidationAc
         if (subject != null) {
             final String name = getUsername(subject);
             if (name != null) {
-                return Collections.singletonMap(IdPAuditFields.USERNAME, name);
+                return CollectionSupport.singletonMap(IdPAuditFields.USERNAME, name);
             }
         }
         
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 bbf9b45c8..2dfc52fc3 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,7 +18,6 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.security.Principal;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
@@ -37,6 +36,7 @@ import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import net.shibboleth.idp.profile.IdPAuditFields;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
@@ -162,13 +162,13 @@ public class ValidateFunctionResult extends AbstractAuditingValidationAction {
     @Nullable protected Map<String,String> getAuditFields(@Nonnull final ProfileRequestContext profileRequestContext) {
         
         if (result instanceof String) {
-            return Collections.singletonMap(IdPAuditFields.USERNAME, (String) result);
+            return CollectionSupport.singletonMap(IdPAuditFields.USERNAME, (String) result);
         } else if (result instanceof UsernamePrincipal) {
-            return Collections.singletonMap(IdPAuditFields.USERNAME, ((UsernamePrincipal) result).getName());
+            return CollectionSupport.singletonMap(IdPAuditFields.USERNAME, ((UsernamePrincipal) result).getName());
         } else if (result instanceof Subject) {
             final String name = getUsername((Subject) result);
             if (name != null) {
-                return Collections.singletonMap(IdPAuditFields.USERNAME, name);
+                return CollectionSupport.singletonMap(IdPAuditFields.USERNAME, name);
             }
         }
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
index 47d466bd8..a0c62d597 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509ProxyFilter.java
@@ -22,7 +22,6 @@ import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -33,6 +32,7 @@ import org.slf4j.Logger;
 
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -69,7 +69,7 @@ public class X509ProxyFilter implements Filter {
 
     /** Constructor. */
     public X509ProxyFilter() {
-        chainHeaders = Collections.emptyList();
+        chainHeaders = CollectionSupport.emptyList();
     }
 
     /** {@inheritDoc} */
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/DoRevocationCacheOperation.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/DoRevocationCacheOperation.java
index a246cd9a0..d762d8773 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/DoRevocationCacheOperation.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/DoRevocationCacheOperation.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.authn.revocation.impl;
 
 import java.io.IOException;
 import java.time.Duration;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 
@@ -42,6 +41,7 @@ import net.shibboleth.idp.profile.context.SpringRequestContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -361,7 +361,7 @@ public class DoRevocationCacheOperation extends AbstractProfileAction {
         
         final Error e = new Error();
         final Errors errors = new Errors();
-        errors.setErrors(Collections.singletonList(e));
+        errors.setErrors(CollectionSupport.singletonList(e));
         e.setStatus(Integer.toString(status));
         e.setTitle(title);
         e.setDetail(detail);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/AuthenticationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/AuthenticationContextTest.java
index 020d8cb05..6d604ea19 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/AuthenticationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/AuthenticationContextTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.authn.context.impl;
 
 import java.time.Instant;
 import java.util.Arrays;
-import java.util.Collections;
 
 import javax.security.auth.Subject;
 
@@ -29,6 +28,7 @@ import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.RequestedPrincipalContext;
 import net.shibboleth.idp.authn.principal.PrincipalEvalPredicateFactoryRegistry;
 import net.shibboleth.idp.authn.testing.TestPrincipal;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -144,7 +144,7 @@ public class AuthenticationContextTest {
         RequestedPrincipalContext rpCtx = ctx.getSubcontext(RequestedPrincipalContext.class);
         assert rpCtx!=null;
         Assert.assertEquals(rpCtx.getOperator(), "foo");
-        Assert.assertEquals(rpCtx.getRequestedPrincipals(), Collections.singletonList(new TestPrincipal("bar")));
+        Assert.assertEquals(rpCtx.getRequestedPrincipals(), CollectionSupport.singletonList(new TestPrincipal("bar")));
         
         Assert.assertFalse(ctx.addRequestedPrincipalContext("foo", new TestPrincipal("bar"), false));
         
@@ -152,15 +152,20 @@ public class AuthenticationContextTest {
         rpCtx = ctx.getSubcontext(RequestedPrincipalContext.class);
         assert rpCtx!=null;
         Assert.assertEquals(rpCtx.getOperator(), "fob");
-        Assert.assertEquals(rpCtx.getRequestedPrincipals(), Collections.singletonList(new TestPrincipal("baz")));
+        Assert.assertEquals(rpCtx.getRequestedPrincipals(), CollectionSupport.singletonList(new TestPrincipal("baz")));
 
-        ctx.addRequestedPrincipalContext("fog", TestPrincipal.class.getName(), Arrays.asList("baf", "bag"), true);
+        ctx.addRequestedPrincipalContext("fog", TestPrincipal.class.getName(), CollectionSupport.listOf("baf", "bag"), true);
         rpCtx = ctx.getSubcontext(RequestedPrincipalContext.class);
         assert rpCtx!=null;
         Assert.assertEquals(rpCtx.getOperator(), "fog");
         Assert.assertEquals(rpCtx.getRequestedPrincipals().size(), 2);
     }
     
+    /**
+     * Tests helper method when bad type used.
+     * 
+     * @throws Exception
+     */
     @Test(expectedExceptions = ClassCastException.class)
     public void testRequestedPrincipalContextHelperBadType() throws Exception {
         final AuthenticationContext ctx = new AuthenticationContext();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
index 74a837f5f..e74259629 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -44,6 +43,7 @@ import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.idp.authn.context.SubjectContext;
 import net.shibboleth.idp.authn.principal.IdPAttributePrincipal;
 import net.shibboleth.idp.saml.authn.principal.AuthenticationMethodPrincipal;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
 
@@ -54,7 +54,8 @@ public class SubjectDerivedAttributeValuesFunctionTest {
     /** Simple result. */
     private static final String SIMPLE_VALUE = "simple";
     
-    @Nonnull private List<IdPAttributeValue> doResolve(@Nonnull final ContextDerivedAttributeDefinition defn, @Nonnull final AttributeResolutionContext ctx) throws ResolutionException {
+    @Nonnull private List<IdPAttributeValue> doResolve(@Nonnull final ContextDerivedAttributeDefinition defn,
+            @Nonnull final AttributeResolutionContext ctx) throws ResolutionException {
         final IdPAttribute attr = defn.resolve(ctx);
         assert attr!=null;
         return attr.getValues();
@@ -203,7 +204,7 @@ public class SubjectDerivedAttributeValuesFunctionTest {
     }
         
     @Test public void empty() throws ComponentInitializationException, ResolutionException {
-        final List<IdPAttributeValue> list = Collections.emptyList();
+        final List<IdPAttributeValue> list = CollectionSupport.emptyList();
         
         final IdPAttribute attr = new IdPAttribute("wibble");
         attr.setValues(list);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
index 822780fac..763024385 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.authn.impl;
 
-import java.util.Collections;
-
 import javax.security.auth.Subject;
 
 import org.springframework.webflow.execution.Event;
@@ -39,6 +37,7 @@ import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link AttributeSourcedSubjectCanonicalization} unit test. */
+ at SuppressWarnings("javadoc")
 public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticationContextTest {
     
     private AttributeSourcedSubjectCanonicalization action; 
@@ -96,12 +95,12 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
         
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
-        inputAttribute.setValues(Collections.singletonList(new StringAttributeValue("foo")));
+        inputAttribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("foo")));
         
         final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         sc.setSubject(new Subject());
         
-        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(inputAttribute));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(CollectionSupport.singleton(inputAttribute));
         
         final Event event = action.execute(src);
         
@@ -114,7 +113,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
         
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
-        inputAttribute.setValues(Collections.singletonList(new StringAttributeValue("foo")));
+        inputAttribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("foo")));
         final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
@@ -131,7 +130,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
         
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
-        inputAttribute.setValues(Collections.singletonList(new ScopedStringAttributeValue("foo", "scope")));
+        inputAttribute.setValues(CollectionSupport.singletonList(new ScopedStringAttributeValue("foo", "scope")));
         final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
@@ -148,17 +147,17 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
 
         final IdPAttribute attr2 = new IdPAttribute("attr2");
-        attr2.setValues(Collections.singletonList(new StringAttributeValue("foo")));
+        attr2.setValues(CollectionSupport.singletonList(new StringAttributeValue("foo")));
 
         final IdPAttribute attr2bar = new IdPAttribute("attr2");
-        attr2bar.setValues(Collections.singletonList(new StringAttributeValue("bar")));
+        attr2bar.setValues(CollectionSupport.singletonList(new StringAttributeValue("bar")));
 
         final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2));
         
-        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2bar));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(CollectionSupport.singleton(attr2bar));
         
         Event event = action.execute(src);
         
@@ -167,7 +166,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
 
         subject.getPrincipals().clear();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2bar));
-        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(CollectionSupport.singleton(attr2));
 
         event = action.execute(src);
         
@@ -180,17 +179,17 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
 
         final IdPAttribute attr2 = new IdPAttribute("attr2");
-        attr2.setValues(Collections.singletonList(new StringAttributeValue("bar")));
+        attr2.setValues(CollectionSupport.singletonList(new StringAttributeValue("bar")));
 
         final IdPAttribute attr1 = new IdPAttribute("attr1");
-        attr1.setValues(Collections.singletonList(new StringAttributeValue("foo")));
+        attr1.setValues(CollectionSupport.singletonList(new StringAttributeValue("foo")));
 
         final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2));
         
-        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr1));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(CollectionSupport.singleton(attr1));
         
         final Event event = action.execute(src);
         
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/BaseMultiFactorAuthenticationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/BaseMultiFactorAuthenticationContextTest.java
index d625012ee..294f28728 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/BaseMultiFactorAuthenticationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/BaseMultiFactorAuthenticationContextTest.java
@@ -24,10 +24,10 @@ import net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
 import net.shibboleth.idp.profile.testing.RequestContextBuilder;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -86,7 +86,7 @@ public class BaseMultiFactorAuthenticationContextTest {
         
         final PopulateAuthenticationContext action = new PopulateAuthenticationContext();
         action.setAvailableFlows(authenticationFlows.values());
-        action.setPotentialFlowsLookupStrategy(FunctionSupport.constant(Collections.singletonList(authenticationFlows.get("authn/MFA"))));
+        action.setPotentialFlowsLookupStrategy(FunctionSupport.constant(CollectionSupport.singletonList(authenticationFlows.get("authn/MFA"))));
         action.initialize();
 
         action.execute(src);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
index 89644db4c..76a2f26ff 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.authn.impl;
 
-import java.security.Principal;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -45,10 +43,12 @@ import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import net.shibboleth.idp.authn.principal.impl.ExactPrincipalEvalPredicateFactory;
 import net.shibboleth.idp.authn.testing.TestPrincipal;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 
 /** Unit test for htpasswd file validation. */
+ at SuppressWarnings("javadoc")
 public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTest {
 
     private static final String DATA_PATH = "src/test/resources/net/shibboleth/idp/authn/impl/";
@@ -65,11 +65,11 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         validator.setId("htpasswdtest");
         
         action = new ValidateCredentials();
-        action.setValidators(Collections.singletonList(validator));
+        action.setValidators(CollectionSupport.singletonList(validator));
         
         final Map<String,Collection<String>> mappings = new HashMap<>();
-        mappings.put("InvalidPassword", Collections.singleton(AuthnEventIds.INVALID_CREDENTIALS));
-        mappings.put(AuthnEventIds.UNKNOWN_USERNAME, Collections.singleton(AuthnEventIds.UNKNOWN_USERNAME));
+        mappings.put("InvalidPassword", CollectionSupport.singleton(AuthnEventIds.INVALID_CREDENTIALS));
+        mappings.put(AuthnEventIds.UNKNOWN_USERNAME, CollectionSupport.singleton(AuthnEventIds.UNKNOWN_USERNAME));
         action.setClassifiedMessages(mappings);
         
         final MockHttpServletRequest request = new MockHttpServletRequest();
@@ -121,9 +121,9 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
-        rpc.setRequestedPrincipals(Collections.<Principal>singletonList(new TestPrincipal("test1")));
+        rpc.setRequestedPrincipals(CollectionSupport.singletonList(new TestPrincipal("test1")));
 
-        validator.setSupportedPrincipals(Collections.<Principal>singletonList(new TestPrincipal("test2")));
+        validator.setSupportedPrincipals(CollectionSupport.singletonList(new TestPrincipal("test2")));
         validator.initialize();
         
         action.initialize();
@@ -328,9 +328,9 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
-        rpc.setRequestedPrincipals(Collections.singletonList(new TestPrincipal("test1")));
+        rpc.setRequestedPrincipals(CollectionSupport.singletonList(new TestPrincipal("test1")));
 
-        validator.setSupportedPrincipals(Collections.singletonList(new TestPrincipal("test1")));
+        validator.setSupportedPrincipals(CollectionSupport.singletonList(new TestPrincipal("test1")));
         validator.initialize();
         
         action.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
index 7607d6782..51b5abf02 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.security.Principal;
-import java.util.Collections;
 
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.RequestedPrincipalContext;
@@ -28,7 +27,6 @@ import net.shibboleth.idp.profile.IdPEventIds;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import net.shibboleth.profile.config.ProfileConfiguration;
 import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
@@ -116,7 +114,7 @@ public class InitializeRequestedPrincipalContextTest {
      */
     @Test public void testInvalidProfileConfiguration() throws Exception {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
+                CollectionSupport.singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
@@ -135,7 +133,7 @@ public class InitializeRequestedPrincipalContextTest {
         final MockAuthenticationProfileConfiguration mock =
                 new MockAuthenticationProfileConfiguration("mock", CollectionSupport.<Principal>emptyList());
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(mock)).buildRequestContext();
+                CollectionSupport.singleton(mock)).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
         
@@ -162,7 +160,7 @@ public class InitializeRequestedPrincipalContextTest {
         final MockAuthenticationProfileConfiguration mock =
                 new MockAuthenticationProfileConfiguration("mock", CollectionSupport.singletonList(method));
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(mock)).buildRequestContext();
+                CollectionSupport.singleton(mock)).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
index 57f4b6a26..d1fa5e77f 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
@@ -25,7 +25,6 @@ import java.net.URISyntaxException;
 import java.security.Principal;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -60,6 +59,7 @@ import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.testing.InMemoryDirectory;
 
 /** Unit test for JAAS validation. */
+ at SuppressWarnings("javadoc")
 public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
 
     private static final String DATA_PATH = "src/test/resources/net/shibboleth/idp/authn/impl/";
@@ -86,6 +86,8 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
 
     /**
      * Shutdown the in-memory directory server.
+     * 
+     * @throws Exception
      */
     @AfterClass public void teardownDirectoryServer() throws Exception {
         if (directoryServer.openConnectionCount() > 0) {
@@ -102,11 +104,11 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         validator.setId("jaastest");
         
         action = new ValidateCredentials();
-        action.setValidators(Collections.singletonList(validator));
+        action.setValidators(CollectionSupport.singletonList(validator));
         
         final Map<String,Collection<String>> mappings = new HashMap<>();
-        mappings.put("UnknownUsername", Collections.singleton("DN_RESOLUTION_FAILURE"));
-        mappings.put("InvalidPassword", Collections.singleton("INVALID_CREDENTIALS"));
+        mappings.put("UnknownUsername", CollectionSupport.singleton("DN_RESOLUTION_FAILURE"));
+        mappings.put("InvalidPassword", CollectionSupport.singleton("INVALID_CREDENTIALS"));
         action.setClassifiedMessages(mappings);
         
         final MockHttpServletRequest request = new MockHttpServletRequest();
@@ -174,7 +176,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
-        validator.setLoginConfigNames(Collections.singletonList("ShibBadAuth"));
+        validator.setLoginConfigNames(CollectionSupport.singletonList("ShibBadAuth"));
         validator.setLoginConfigType("JavaLoginConfig");
         validator.setLoginConfigParameters(URISupport.fileURIFromAbsolutePath(getCurrentDir()
                 + '/' + DATA_PATH + "jaas.config"));
@@ -207,8 +209,8 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         rpc.setOperator("exact");
         rpc.setRequestedPrincipals(CollectionSupport.<Principal>singletonList(new TestPrincipal("test1")));
 
-        validator.setLoginConfigurations(Collections.singletonList(new Pair<String,Collection<Principal>>("ShibUserPassAuth",
-                Collections.singletonList(new TestPrincipal("test2")))));
+        validator.setLoginConfigurations(CollectionSupport.singletonList(new Pair<String,Collection<Principal>>("ShibUserPassAuth",
+                CollectionSupport.singletonList(new TestPrincipal("test2")))));
         validator.setLoginConfigType("JavaLoginConfig");
         validator.setLoginConfigParameters(URISupport.fileURIFromAbsolutePath(getCurrentDir()
                 + '/' + DATA_PATH + "jaas.config"));
@@ -355,8 +357,8 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         rpc.setOperator("exact");
         rpc.setRequestedPrincipals(CollectionSupport.<Principal>singletonList(new TestPrincipal("test1")));
 
-        validator.setLoginConfigurations(Collections.singletonList(new Pair<String,Collection<Principal>>("ShibUserPassAuth",
-                Collections.<Principal>singletonList(new TestPrincipal("test1")))));
+        validator.setLoginConfigurations(CollectionSupport.singletonList(new Pair<>("ShibUserPassAuth",
+                CollectionSupport.singletonList(new TestPrincipal("test1")))));
         validator.setLoginConfigType("JavaLoginConfig");
         validator.setLoginConfigResource(new ClassPathResource(DATA_CLASSPATH + "jaas.config"));
         validator.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
index 0ae46a94f..e4f6ed23e 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
@@ -20,9 +20,7 @@ package net.shibboleth.idp.authn.impl;
 import static org.testng.Assert.assertEquals;
 
 import java.time.ZonedDateTime;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
@@ -59,12 +57,14 @@ import net.shibboleth.idp.authn.context.UsernamePasswordContext;
 import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
 import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.testing.InMemoryDirectory;
 import net.shibboleth.shared.testing.VelocityEngine;
 
 /** Unit test for LDAP credential validation. */
+ at SuppressWarnings("javadoc")
 public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
 
     private static final String DATA_PATH = "/net/shibboleth/idp/authn/impl/";
@@ -109,6 +109,8 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
 
     /**
      * Shutdown the in-memory directory server.
+     * 
+     * @throws Exception 
      */
     @AfterClass public void teardownDirectoryServer() throws Exception {
         if (directoryServer.openConnectionCount() > 0) {
@@ -125,13 +127,13 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         validator.setId("ldaptest");
         
         action = new ValidateCredentials();
-        action.setValidators(Collections.singletonList(validator));
+        action.setValidators(CollectionSupport.singletonList(validator));
 
         final Map<String, Collection<String>> mappings = new HashMap<>();
-        mappings.put("UnknownUsername", Collections.singleton("DN_RESOLUTION_FAILURE"));
-        mappings.put("InvalidPassword", Collections.singleton("INVALID_CREDENTIALS"));
-        mappings.put("ExpiringPassword", Collections.singleton("ACCOUNT_WARNING"));
-        mappings.put("ExpiredPassword", Arrays.asList("PASSWORD_EXPIRED", "CHANGE_AFTER_RESET"));
+        mappings.put("UnknownUsername", CollectionSupport.singleton("DN_RESOLUTION_FAILURE"));
+        mappings.put("InvalidPassword", CollectionSupport.singleton("INVALID_CREDENTIALS"));
+        mappings.put("ExpiringPassword", CollectionSupport.singleton("ACCOUNT_WARNING"));
+        mappings.put("ExpiredPassword", CollectionSupport.listOf("PASSWORD_EXPIRED", "CHANGE_AFTER_RESET"));
         action.setClassifiedMessages(mappings);
         final MockHttpServletRequest request = new MockHttpServletRequest();
         action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContextTest.java
index 95d391d48..254b78b85 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateAuthenticationContextTest.java
@@ -20,14 +20,12 @@ package net.shibboleth.idp.authn.impl;
 import net.shibboleth.idp.authn.AuthenticationFlowDescriptor;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
 
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
-import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
@@ -110,8 +108,7 @@ final public class PopulateAuthenticationContextTest extends BaseAuthenticationC
         final PopulateAuthenticationContext action = new PopulateAuthenticationContext();
         action.setAvailableFlows(authenticationFlows);
         action.setPotentialFlowsLookupStrategy(FunctionSupport.constant(authenticationFlows));
-        action.setActiveFlowsLookupStrategy(
-                FunctionSupport.<ProfileRequestContext,Collection<String>>constant(Collections.singletonList("test2")));
+        action.setActiveFlowsLookupStrategy(FunctionSupport.constant(CollectionSupport.singletonList("test2")));
         action.initialize();
 
         action.execute(src);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
index 19c0f7b56..e125fb5bd 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
@@ -19,8 +19,6 @@ package net.shibboleth.idp.authn.impl;
 
 import java.time.Duration;
 import java.time.Instant;
-import java.util.Collections;
-import java.util.Map;
 
 import javax.security.auth.Subject;
 
@@ -34,6 +32,7 @@ import net.shibboleth.idp.authn.principal.AuthenticationResultPrincipal;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
 import net.shibboleth.idp.profile.testing.RequestContextBuilder;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
 
@@ -45,6 +44,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 /** {@link PopulateMultiFactorAuthenticationContext} unit test. */
+ at SuppressWarnings("javadoc")
 public class PopulateMultiFactorAuthenticationContextTest {
 
     private RequestContext rc;
@@ -75,8 +75,7 @@ public class PopulateMultiFactorAuthenticationContextTest {
     
     @Test public void testTransitions() throws ComponentInitializationException {
         action.setTransitionMapLookupStrategy(
-                FunctionSupport.<ProfileRequestContext,Map<String,MultiFactorAuthenticationTransition>>constant(
-                        Collections.singletonMap("", new MultiFactorAuthenticationTransition())));
+                FunctionSupport.constant(CollectionSupport.singletonMap("", new MultiFactorAuthenticationTransition())));
         action.initialize();
         final Event event = action.execute(rc);
         ActionTestingSupport.assertProceedEvent(event);
@@ -138,8 +137,7 @@ public class PopulateMultiFactorAuthenticationContextTest {
         ac.setMaxAge(Duration.ofMinutes(30));
         
         action.setTransitionMapLookupStrategy(
-                FunctionSupport.<ProfileRequestContext,Map<String,MultiFactorAuthenticationTransition>>constant(
-                        Collections.singletonMap("", new MultiFactorAuthenticationTransition())));
+                FunctionSupport.constant(CollectionSupport.singletonMap("", new MultiFactorAuthenticationTransition())));
         action.initialize();
         final Event event = action.execute(rc);
         ActionTestingSupport.assertProceedEvent(event);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlowTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlowTest.java
index 7ecaa84ac..77f57f65a 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlowTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SelectAuthenticationFlowTest.java
@@ -18,8 +18,6 @@
 package net.shibboleth.idp.authn.impl;
 
 import java.security.Principal;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import javax.security.auth.Subject;
@@ -39,9 +37,11 @@ import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
 import net.shibboleth.idp.authn.principal.impl.ExactPrincipalEvalPredicateFactory;
 import net.shibboleth.idp.authn.testing.TestPrincipal;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link SelectAuthenticationFlow} unit test. */
+ at SuppressWarnings("javadoc")
 public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest {
     
     private SelectAuthenticationFlow action; 
@@ -101,7 +101,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.setActiveResults(Arrays.asList(active));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
         
         final Event event = action.execute(src);
         
@@ -113,7 +113,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.setActiveResults(Arrays.asList(active));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
         authCtx.setForceAuthn(true);
         
         final Event event = action.execute(src);
@@ -127,7 +127,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.setOperator("exact");
-        rpc.setRequestedPrincipals(Arrays.<Principal>asList(new TestPrincipal("foo")));
+        rpc.setRequestedPrincipals(CollectionSupport.singletonList(new TestPrincipal("foo")));
         assert authCtx != null;
         authCtx.addSubcontext(rpc, true);
         
@@ -138,7 +138,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
 
     @Test public void testPreferredNoMatch() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"));
+        final List<Principal> principals = CollectionSupport.singletonList(new TestPrincipal("test3"));
         final PreferredPrincipalContext ppc = new PreferredPrincipalContext();
         ppc.setPreferredPrincipals(principals);
         assert authCtx != null;
@@ -156,7 +156,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
 
     @Test public void testPreferredNoneActive() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"));
+        final List<Principal> principals = CollectionSupport.singletonList(new TestPrincipal("test3"));
         final PreferredPrincipalContext ppc = new PreferredPrincipalContext();
         ppc.setPreferredPrincipals(principals);
         assert authCtx != null;
@@ -175,7 +175,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
     
     @Test public void testPreferredPickActiveNonMatch() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final PreferredPrincipalContext ppc = new PreferredPrincipalContext();
         ppc.setPreferredPrincipals(principals);
@@ -183,8 +183,8 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         authCtx.addSubcontext(ppc, true);
         final AuthenticationResult active = new AuthenticationResult("test1", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("test1"));
-        authCtx.setActiveResults(Arrays.asList(active));
-        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(Collections.singletonList(principals.get(0)));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
+        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(CollectionSupport.singletonList(principals.get(0)));
         
         final Event event = action.execute(src);
         
@@ -194,7 +194,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
 
     @Test public void testPreferredPickActiveMatch() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final PreferredPrincipalContext ppc = new PreferredPrincipalContext();
         ppc.setPreferredPrincipals(principals);
@@ -204,8 +204,8 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         final AuthenticationResult active3 = new AuthenticationResult("test3", new Subject());
         active1.getSubject().getPrincipals().add(new TestPrincipal("test1"));
         active3.getSubject().getPrincipals().add(new TestPrincipal("test3"));
-        authCtx.setActiveResults(Arrays.asList(active1, active3));
-        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(Collections.singletonList(principals.get(0)));
+        authCtx.setActiveResults(CollectionSupport.listOf(active1, active3));
+        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(CollectionSupport.singletonList(principals.get(0)));
         
         final Event event = action.execute(src);
         
@@ -215,7 +215,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
 
     @Test public void testRequestNoneActive() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"));
+        final List<Principal> principals = CollectionSupport.singletonList(new TestPrincipal("test3"));
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
@@ -238,7 +238,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
         authCtx.getIntermediateFlows().put("test2", authCtx.getPotentialFlows().get("test2"));
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
@@ -261,7 +261,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
     
     @Test public void testRequestPickInactive() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
@@ -272,8 +272,8 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         authCtx.addSubcontext(rpc, true);
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("test2"));
-        authCtx.setActiveResults(Arrays.asList(active));
-        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(Collections.singletonList(principals.get(0)));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
+        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(CollectionSupport.singletonList(principals.get(0)));
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, "test3");
@@ -284,7 +284,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
 
     @Test public void testRequestPickActive() {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
@@ -295,8 +295,8 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         authCtx.addSubcontext(rpc, true);
         final AuthenticationResult active = new AuthenticationResult("test3", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("test3"));
-        authCtx.setActiveResults(Arrays.asList(active));
-        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(Collections.singletonList(principals.get(0)));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
+        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(CollectionSupport.singletonList(principals.get(0)));
         
         final Event event = action.execute(src);
         
@@ -307,7 +307,7 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
     @Test public void testRequestFavorSSO() throws ComponentInitializationException {
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        final List<Principal> principals = Arrays.<Principal>asList(new TestPrincipal("test3"),
+        final List<Principal> principals = CollectionSupport.listOf(new TestPrincipal("test3"),
                 new TestPrincipal("test2"));
         final RequestedPrincipalContext rpc = new RequestedPrincipalContext();
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
@@ -317,8 +317,8 @@ public class SelectAuthenticationFlowTest extends BaseAuthenticationContextTest
         authCtx.addSubcontext(rpc, true);
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("test2"));
-        authCtx.setActiveResults(Arrays.asList(active));
-        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(Collections.singletonList(principals.get(0)));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
+        authCtx.getPotentialFlows().get("test3").setSupportedPrincipals(CollectionSupport.singletonList(principals.get(0)));
         
         action = new SelectAuthenticationFlow();
         action.setFavorSSO(true);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
index f97421c77..08c3ec624 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateCredentialsTest.java
@@ -19,9 +19,7 @@ package net.shibboleth.idp.authn.impl;
 
 import static org.testng.Assert.assertEquals;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -51,12 +49,14 @@ import net.shibboleth.idp.authn.context.UsernamePasswordContext;
 import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
 import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 import net.shibboleth.shared.testing.InMemoryDirectory;
 import net.shibboleth.shared.testing.VelocityEngine;
 
 /** Unit test for multiple credential validation. */
+ at SuppressWarnings("javadoc")
 public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
 
     private static final String DATA_PATH = "/net/shibboleth/idp/authn/impl/";
@@ -99,6 +99,8 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
 
     /**
      * Shutdown the in-memory directory server.
+     * 
+     * @throws Exception 
      */
     @AfterClass public void teardownDirectoryServer() throws Exception {
         if (directoryServer.openConnectionCount() > 0) {
@@ -123,14 +125,14 @@ public class ValidateCredentialsTest extends BaseAuthenticationContextTest {
         htpasswd.initialize();
         
         action = new ValidateCredentials();
-        action.setValidators(Arrays.asList(ldap, htpasswd));
+        action.setValidators(CollectionSupport.listOf(ldap, htpasswd));
 
         final Map<String, Collection<String>> mappings = new HashMap<>();
-        mappings.put("UnknownUsername", Collections.singleton("DN_RESOLUTION_FAILURE"));
-        mappings.put("InvalidPassword", Collections.singleton("INVALID_CREDENTIALS"));
-        mappings.put("InvalidPassword", Collections.singleton(AuthnEventIds.INVALID_CREDENTIALS));
-        mappings.put("ExpiringPassword", Collections.singleton("ACCOUNT_WARNING"));
-        mappings.put("ExpiredPassword", Arrays.asList("PASSWORD_EXPIRED", "CHANGE_AFTER_RESET"));
+        mappings.put("UnknownUsername", CollectionSupport.singleton("DN_RESOLUTION_FAILURE"));
+        mappings.put("InvalidPassword", CollectionSupport.singleton("INVALID_CREDENTIALS"));
+        mappings.put("InvalidPassword", CollectionSupport.singleton(AuthnEventIds.INVALID_CREDENTIALS));
+        mappings.put("ExpiringPassword", CollectionSupport.singleton("ACCOUNT_WARNING"));
+        mappings.put("ExpiredPassword", CollectionSupport.listOf("PASSWORD_EXPIRED", "CHANGE_AFTER_RESET"));
         action.setClassifiedMessages(mappings);
         final MockHttpServletRequest request = new MockHttpServletRequest();
         action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
index aa5e0032d..adfbe63a7 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/ValidateUserAgentAddressTest.java
@@ -17,12 +17,6 @@
 
 package net.shibboleth.idp.authn.impl;
 
-
-import java.security.Principal;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.webflow.execution.Event;
 import org.testng.Assert;
@@ -38,11 +32,13 @@ import net.shibboleth.idp.authn.principal.UsernamePrincipal;
 import net.shibboleth.idp.authn.principal.impl.ExactPrincipalEvalPredicateFactory;
 import net.shibboleth.idp.authn.testing.TestPrincipal;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.net.IPRange;
 import net.shibboleth.shared.testing.ConstantSupplier;
 
 /** {@link ValidateUserAgentAddress} unit test. */
+ at SuppressWarnings("javadoc")
 public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest {
     
     private ValidateUserAgentAddress action; 
@@ -53,9 +49,9 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         super.setUp();
         
         action = new ValidateUserAgentAddress();
-        action.setMappings(Collections.<String,Collection<IPRange>>singletonMap(
-                "foo", Arrays.asList(IPRange.parseCIDRBlock("192.168.1.0/24"))));
-        action.setSupportedPrincipals(Arrays.asList(new TestPrincipal("UserAgentAuthentication")));
+        action.setMappings(CollectionSupport.singletonMap("foo",
+                CollectionSupport.singletonList(IPRange.parseCIDRBlock("192.168.1.0/24"))));
+        action.setSupportedPrincipals(CollectionSupport.singletonList(new TestPrincipal("UserAgentAuthentication")));
         final MockHttpServletRequest request = new MockHttpServletRequest();
         action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         action.initialize();
@@ -110,7 +106,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
-        rpc.setRequestedPrincipals(Arrays.<Principal>asList(new TestPrincipal("PasswordAuthentication")));
+        rpc.setRequestedPrincipals(CollectionSupport.singletonList(new TestPrincipal("PasswordAuthentication")));
         ac.addSubcontext(rpc, true);
         
         doExtract();
@@ -130,7 +126,7 @@ public class ValidateUserAgentAddressTest extends BaseAuthenticationContextTest
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
-        rpc.setRequestedPrincipals(Arrays.<Principal>asList(new TestPrincipal("UserAgentAuthentication")));
+        rpc.setRequestedPrincipals(CollectionSupport.singletonList(new TestPrincipal("UserAgentAuthentication")));
         ac.addSubcontext(rpc, true);
         
         doExtract();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X509CertificateCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X509CertificateCredentialValidatorTest.java
index a3671556e..34c098c90 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X509CertificateCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X509CertificateCredentialValidatorTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.authn.impl;
 
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 import javax.security.auth.x500.X500Principal;
@@ -45,10 +44,12 @@ import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 
 /** {@link X509CertificateCredentialValidator} unit test. */
+ at SuppressWarnings("javadoc")
 public class X509CertificateCredentialValidatorTest extends BaseAuthenticationContextTest {
     
     @Nonnull final private String entityCertBase64 = 
@@ -106,7 +107,7 @@ public class X509CertificateCredentialValidatorTest extends BaseAuthenticationCo
         validator.setId("x509");
         
         action = new ValidateCredentials();
-        action.setValidators(Collections.singletonList(validator));
+        action.setValidators(CollectionSupport.singletonList(validator));
         final MockHttpServletRequest request = new MockHttpServletRequest();
         action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         action.initialize();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/RequestedPrincipalContextPrincipalEvalTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/RequestedPrincipalContextPrincipalEvalTest.java
index a910bf50b..203261a98 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/RequestedPrincipalContextPrincipalEvalTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/principal/impl/RequestedPrincipalContextPrincipalEvalTest.java
@@ -18,11 +18,10 @@
 package net.shibboleth.idp.authn.principal.impl;
 
 import java.security.Principal;
-import java.util.Arrays;
-import java.util.Collections;
 
 import net.shibboleth.idp.authn.context.RequestedPrincipalContext;
 import net.shibboleth.idp.authn.principal.UsernamePrincipal;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
@@ -32,6 +31,7 @@ import org.testng.annotations.Test;
  * Tests the {@link RequestedPrincipalContext#isAcceptable(Principal)} method using a mocked up
  * registry of evaluation predicates.
  */
+ at SuppressWarnings("javadoc")
 public class RequestedPrincipalContextPrincipalEvalTest {
     
     /**
@@ -62,13 +62,13 @@ public class RequestedPrincipalContextPrincipalEvalTest {
 
     @Test public void testUnknownOperator() {
         rpCtx.setOperator("unknown");
-        rpCtx.setRequestedPrincipals(Collections.<Principal>singletonList(foo));
+        rpCtx.setRequestedPrincipals(CollectionSupport.singletonList(foo));
         Assert.assertFalse(rpCtx.isAcceptable(foo));
     }
 
     @Test public void testExact() {
         rpCtx.setOperator("exact");
-        rpCtx.setRequestedPrincipals(Arrays.<Principal>asList(foo, bar));
+        rpCtx.setRequestedPrincipals(CollectionSupport.listOf(foo, bar));
         Assert.assertTrue(rpCtx.isAcceptable(foo));
         Assert.assertTrue(rpCtx.isAcceptable(bar));
         Assert.assertFalse(rpCtx.isAcceptable(baz));
@@ -76,7 +76,7 @@ public class RequestedPrincipalContextPrincipalEvalTest {
 
     @Test public void testBetterKnown() {
         rpCtx.setOperator("better");
-        rpCtx.setRequestedPrincipals(Arrays.<Principal>asList(foo));
+        rpCtx.setRequestedPrincipals(CollectionSupport.singletonList(foo));
         Assert.assertFalse(rpCtx.isAcceptable(foo));
         Assert.assertTrue(rpCtx.isAcceptable(bar));
         Assert.assertFalse(rpCtx.isAcceptable(baz));
@@ -84,7 +84,7 @@ public class RequestedPrincipalContextPrincipalEvalTest {
 
     @Test public void testBetterUnknown() {
         rpCtx.setOperator("better");
-        rpCtx.setRequestedPrincipals(Arrays.<Principal>asList(bar));
+        rpCtx.setRequestedPrincipals(CollectionSupport.singletonList(bar));
         Assert.assertFalse(rpCtx.isAcceptable(foo));
         Assert.assertFalse(rpCtx.isAcceptable(bar));
         Assert.assertFalse(rpCtx.isAcceptable(baz));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationConditionTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationConditionTest.java
index 21af8cf89..41d753656 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationConditionTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationConditionTest.java
@@ -18,9 +18,7 @@
 package net.shibboleth.idp.authn.revocation.impl;
 
 import java.time.Instant;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.stream.Collectors;
 
 import javax.annotation.Nonnull;
@@ -34,6 +32,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.authn.AuthenticationResult;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.impl.testing.BaseAuthenticationContextTest;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
 import net.shibboleth.shared.service.ReloadableService;
@@ -45,6 +44,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 /** {@link AttributeRevocationCondition} unit test. */
+ at SuppressWarnings("javadoc")
 public class AttributeRevocationConditionTest extends BaseAuthenticationContextTest {
     
     private Collection<Instant> revocationsToResolve;
@@ -74,7 +74,7 @@ public class AttributeRevocationConditionTest extends BaseAuthenticationContextT
         final AuthenticationResult active = authenticationFlows.get(1).newAuthenticationResult(new Subject());
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.setActiveResults(Arrays.asList(active));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
 
         Assert.assertTrue(active.test(prc));
     }
@@ -83,9 +83,9 @@ public class AttributeRevocationConditionTest extends BaseAuthenticationContextT
         final AuthenticationResult active = authenticationFlows.get(1).newAuthenticationResult(new Subject());
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.setActiveResults(Arrays.asList(active));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
 
-        revocationsToResolve = Collections.singletonList(Instant.now().plusSeconds(3600));
+        revocationsToResolve = CollectionSupport.singletonList(Instant.now().plusSeconds(3600));
         
         Assert.assertFalse(active.test(prc));
     }
@@ -94,9 +94,9 @@ public class AttributeRevocationConditionTest extends BaseAuthenticationContextT
         final AuthenticationResult active = authenticationFlows.get(1).newAuthenticationResult(new Subject());
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.setActiveResults(Arrays.asList(active));
+        authCtx.setActiveResults(CollectionSupport.singletonList(active));
 
-        revocationsToResolve = Collections.singletonList(Instant.now().minusSeconds(3600));
+        revocationsToResolve = CollectionSupport.singletonList(Instant.now().minusSeconds(3600));
         
         Assert.assertTrue(active.test(prc));
     }
@@ -145,7 +145,7 @@ public class AttributeRevocationConditionTest extends BaseAuthenticationContextT
                             return "test";
                         }
 
-                        public void resolveAttributes(AttributeResolutionContext resolutionContext)
+                        public void resolveAttributes(@Nonnull final AttributeResolutionContext resolutionContext)
                                 throws ResolutionException {
                             if ("jdoe".equals(resolutionContext.getPrincipal()) && revocationsToResolve != null) {
                                 final IdPAttribute attr = new IdPAttribute("revocation");
@@ -154,7 +154,7 @@ public class AttributeRevocationConditionTest extends BaseAuthenticationContextT
                                             .map(i -> StringAttributeValue.valueOf(Long.toString(i.getEpochSecond())))
                                             .collect(Collectors.toUnmodifiableList())
                                         );
-                                resolutionContext.setResolvedIdPAttributes(Collections.singletonList(attr));
+                                resolutionContext.setResolvedIdPAttributes(CollectionSupport.singletonList(attr));
                             }
                         }
                     };
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/TicketValidationResponse.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/TicketValidationResponse.java
index 83d2c6101..618dd689b 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/TicketValidationResponse.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/TicketValidationResponse.java
@@ -22,12 +22,12 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -82,7 +82,7 @@ public class TicketValidationResponse extends AbstractProtocolResponse {
      * @return immutable collection of user attributes
      */
     @Nonnull @NonnullElements @NotLive @Unmodifiable public Collection<Attribute> getAttributes() {
-        final Collection<Attribute> result = Collections.unmodifiableList(attributes);
+        final Collection<Attribute> result = CollectionSupport.copyToList(attributes);
         assert result!=null;
         return result;
     }
@@ -120,7 +120,7 @@ public class TicketValidationResponse extends AbstractProtocolResponse {
      * @return immutable list of proxies traversed in order of most recent to last recent
      */
     @Nonnull @NonnullElements @NotLive @Unmodifiable public List<String> getProxies() {
-        final List<String> result =  Collections.unmodifiableList(proxies);
+        final List<String> result =  CollectionSupport.copyToList(proxies);
         assert result!=null;
         return result;
     }
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 332bf8e50..cf3c91218 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
@@ -19,7 +19,6 @@ package net.shibboleth.idp.cas.flow.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Set;
 import java.util.function.Function;
 
@@ -109,8 +108,9 @@ public class PrepareTicketValidationResponseAction extends
 
     /** Constructor. */
     public PrepareTicketValidationResponseAction() {
-        final Function<ProfileRequestContext,AttributeContext> acf = new ChildContextLookup<>(AttributeContext.class, true).compose(
-                new ChildContextLookup<>(RelyingPartyContext.class));
+        final Function<ProfileRequestContext,AttributeContext> acf =
+                new ChildContextLookup<>(AttributeContext.class, true).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         assert acf != null;
         attributeContextFunction = acf;
         principalLookupFunction = new TicketPrincipalLookupFunction();
@@ -256,7 +256,7 @@ public class PrepareTicketValidationResponseAction extends
         if (transcodingRules.isEmpty()) {
             log.debug("{} Attribute {} does not have any transcoding rules, applying default", getLogPrefix(),
                     attribute.getId());
-            transcodingRules = Collections.singletonList(defaultTranscodingRule);
+            transcodingRules = CollectionSupport.singletonList(defaultTranscodingRule);
         }
         
         int count = 0;
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 45147ed6c..0e473bbd4 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
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.net.URI;
 import java.security.GeneralSecurityException;
 import java.security.cert.CertificateException;
-import java.util.Collections;
 import java.util.Set;
 import java.util.function.Function;
 
@@ -40,6 +39,7 @@ import net.shibboleth.idp.cas.service.Service;
 import net.shibboleth.idp.cas.service.ServiceContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.resolver.CriteriaSet;
@@ -113,7 +113,7 @@ public class HttpClientProxyValidator implements ProxyValidator {
             @Nonnull final HttpClient client, @Nonnull final HttpClientSecurityParameters parameters) {
         httpClient = Constraint.isNotNull(client, "HTTP client cannot be null");
         securityParameters = Constraint.isNotNull(parameters, "HTTP client security parameters cannot be null");
-        allowedResponseCodes = Collections.singleton(200);
+        allowedResponseCodes = CollectionSupport.singleton(200);
     }
 
     /**
@@ -124,7 +124,7 @@ public class HttpClientProxyValidator implements ProxyValidator {
     public void setAllowedResponseCodes(@NotEmpty @NonnullElements final Set<Integer> responseCodes) {
         Constraint.isNotEmpty(responseCodes, "Response codes cannot be null or empty.");
         Constraint.noNullItems(responseCodes.toArray(), "Response codes cannot contain null elements.");
-        allowedResponseCodes = Set.copyOf(responseCodes);
+        allowedResponseCodes = CollectionSupport.copyToSet(responseCodes);
     }
 
     /** {@inheritDoc} */
@@ -214,7 +214,7 @@ public class HttpClientProxyValidator implements ProxyValidator {
                 new EntityRoleCriterion(SPSSODescriptor.DEFAULT_ELEMENT_NAME),
                 new ProtocolCriterion(AbstractProtocolConfiguration.PROTOCOL_URI),
                 new UsageCriterion(UsageType.SIGNING),
-                new TrustedNamesCriterion(Collections.singleton(requestUri.getHost())));
+                new TrustedNamesCriterion(CollectionSupport.singleton(requestUri.getHost())));
         context.setAttribute(CONTEXT_KEY_CRITERIA_SET, criteria);
     }
 
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASDateTimeAttributeTranscoderTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASDateTimeAttributeTranscoderTest.java
index 4a8dc65a3..36d0bf110 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASDateTimeAttributeTranscoderTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASDateTimeAttributeTranscoderTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.cas.attribute.transcoding.impl;
 
 import java.time.Instant;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -67,7 +66,7 @@ public class CASDateTimeAttributeTranscoderTest {
         final CASDateTimeAttributeTranscoder transcoder = new CASDateTimeAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractCASAttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
index 9a5238040..1921f4cf2 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASScopedStringAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.cas.attribute.transcoding.impl;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -72,7 +70,7 @@ public class CASScopedStringAttributeTranscoderTest {
         final CASScopedStringAttributeTranscoder transcoder = new CASScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractCASAttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -125,7 +123,7 @@ public class CASScopedStringAttributeTranscoderTest {
     @Test(expectedExceptions = {AttributeEncodingException.class,}) public void inappropriate() throws Exception {
         final int[] intArray = {1, 2, 3, 4};
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}), new IdPAttributeValue() {
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}), new IdPAttributeValue() {
                     @Override
                     public @Nonnull Object getNativeValue() {
                         return intArray;
@@ -150,7 +148,7 @@ public class CASScopedStringAttributeTranscoderTest {
     
     @Test public void single() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}),
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}),
                         new ScopedStringAttributeValue(STRING_1, SCOPE_1),
                         new StringAttributeValue(STRING_1),
                         new StringAttributeValue(STRING_1 + "@" + SCOPE_1));
@@ -201,7 +199,7 @@ public class CASScopedStringAttributeTranscoderTest {
         
     @Test public void multi() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}),
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}),
                         new ScopedStringAttributeValue(STRING_1, SCOPE_1),
                         new ScopedStringAttributeValue(STRING_2, SCOPE_2));
 
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
index f9990586c..a2c159c8b 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/attribute/transcoding/impl/CASStringAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.cas.attribute.transcoding.impl;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -68,7 +66,7 @@ public class CASStringAttributeTranscoderTest {
         final CASStringAttributeTranscoder transcoder = new CASStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractCASAttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -119,7 +117,7 @@ public class CASStringAttributeTranscoderTest {
     @Test(expectedExceptions = {AttributeEncodingException.class,}) public void inappropriate() throws Exception {
         final int[] intArray = {1, 2, 3, 4};
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}), new IdPAttributeValue() {
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}), new IdPAttributeValue() {
                     @Override
                     public @Nonnull Object getNativeValue() {
                         return intArray;
@@ -145,7 +143,7 @@ public class CASStringAttributeTranscoderTest {
     
     @Test public void single() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}), new StringAttributeValue(STRING_1));
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}), new StringAttributeValue(STRING_1));
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_ID);
         inputAttribute.setValues(values);
@@ -190,7 +188,7 @@ public class CASStringAttributeTranscoderTest {
         
     @Test public void multi() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(new byte[] {1, 2, 3,}),
+                CollectionSupport.listOf(new ByteAttributeValue(new byte[] {1, 2, 3,}),
                         new StringAttributeValue(STRING_1),
                         new StringAttributeValue(STRING_2),
                         new ScopedStringAttributeValue(STRING_1, STRING_2));
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidatorTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidatorTest.java
index a4bd19a46..9e735ffdb 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidatorTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/proxy/impl/HttpClientProxyValidatorTest.java
@@ -28,7 +28,6 @@ import java.net.URI;
 import java.nio.ByteBuffer;
 import java.security.cert.CertificateException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -60,6 +59,7 @@ import net.shibboleth.idp.cas.flow.impl.AbstractFlowActionTest;
 import net.shibboleth.idp.cas.protocol.ProtocolContext;
 import net.shibboleth.idp.cas.service.Service;
 import net.shibboleth.idp.cas.service.ServiceContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  * Unit test for {@link HttpClientProxyValidator} class.
@@ -127,7 +127,7 @@ public class HttpClientProxyValidatorTest extends AbstractFlowActionTest {
         // This is an attempt to get them portably depending on whether IPv4 and/or IPv6 is enabled.
 
         // Resolve the 'localhost' addrs that will be resolved and used by HttpClient
-        final List<InetAddress> localhostAddrs = Arrays.asList(SystemDefaultDnsResolver.INSTANCE.resolve("localhost"));
+        final List<InetAddress> localhostAddrs = CollectionSupport.listOf(SystemDefaultDnsResolver.INSTANCE.resolve("localhost"));
 
         // Resolve available loopback and link-local interfaces
         // Using ByteBuffer just to get hashcode() and equals() for byte[] for filtering using the Set.
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistryTest.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistryTest.java
index 25bf6c655..e11d9a7ab 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistryTest.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/service/impl/MetadataServiceRegistryTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 
 import java.time.Duration;
-import java.util.Collections;
 import java.util.Timer;
 
 import javax.annotation.Nonnull;
@@ -31,7 +30,6 @@ import org.opensaml.core.config.InitializationService;
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.saml.metadata.resolver.impl.PredicateRoleDescriptorResolver;
 import org.opensaml.saml.metadata.resolver.impl.ResourceBackedMetadataResolver;
-import org.opensaml.saml.metadata.resolver.index.MetadataIndex;
 import org.opensaml.saml.metadata.resolver.index.impl.EndpointMetadataIndex;
 import org.springframework.core.io.ClassPathResource;
 import org.testng.annotations.AfterClass;
@@ -41,6 +39,7 @@ import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.cas.service.Service;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.resource.Resource;
 import net.shibboleth.shared.spring.resource.ResourceHelper;
@@ -94,7 +93,7 @@ public class MetadataServiceRegistryTest {
         assert fiveHundredSeconds!=null;
         metadataResolver.setMaxRefreshDelay(fiveHundredSeconds);
         metadataResolver.setId("cas");
-        metadataResolver.setIndexes(Collections.<MetadataIndex>singleton(new EndpointMetadataIndex(
+        metadataResolver.setIndexes(CollectionSupport.singleton(new EndpointMetadataIndex(
                 new MetadataServiceRegistry.LoginEndpointPredicate())));
         metadataResolver.initialize();
     }
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/LoginFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/LoginFlowTest.java
index 72779657d..3d9e2dff4 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/LoginFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/cas/LoginFlowTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -60,6 +59,7 @@ import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.profile.relyingparty.RelyingPartyConfiguration;
 import net.shibboleth.profile.relyingparty.RelyingPartyConfigurationResolver;
 import net.shibboleth.profile.relyingparty.VerifiedProfileCriterion;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.net.URISupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.service.ReloadableService;
@@ -93,7 +93,7 @@ public class LoginFlowTest extends AbstractFlowTest {
 
     @BeforeMethod
     public void setUp() throws Exception {
-        setPostAuthenticationFlows(Collections.emptyList());
+        setPostAuthenticationFlows(CollectionSupport.emptyList());
     }
 
 
@@ -203,7 +203,7 @@ public class LoginFlowTest extends AbstractFlowTest {
     public void testLoginWithConsent() throws Exception {
         final String service = "https://start.example.org/";
         externalContext.getMockRequestParameterMap().put("service", service);
-        setPostAuthenticationFlows(Collections.singletonList("attribute-release"));
+        setPostAuthenticationFlows(CollectionSupport.singletonList("attribute-release"));
         overrideEndStateOutput(FLOW_ID, "RedirectToService");
 
         final FlowExecutionResult result = flowExecutor.launchExecution(FLOW_ID, null, externalContext);
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 4566d52d3..72d5db59e 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
@@ -18,13 +18,13 @@
 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;
 
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -54,12 +54,12 @@ public class CurrentConsentIdsAuditExtractor implements Function<ProfileRequestC
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null) {
             return consentContext.getCurrentConsents().keySet();
         }
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractor.java
index a40efae4a..c0df33590 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
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.consent.audit.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -27,6 +26,7 @@ import javax.annotation.Nullable;
 
 import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -68,7 +68,7 @@ public class CurrentConsentIsApprovedAuditExtractor implements Function<ProfileR
                     map(Consent::isApproved).
                     collect(Collectors.toList());
         }
-        return Collections.emptyList();
+        return CollectionSupport.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 9fee7056b..d3d81dd68 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
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.consent.audit.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -27,6 +26,7 @@ import javax.annotation.Nullable;
 
 import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -56,7 +56,7 @@ public class CurrentConsentValuesAuditExtractor implements Function<ProfileReque
     }
 
     /** {@inheritDoc} */
-    @Override @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
+    @Nullable public Collection<String> apply(@Nullable final ProfileRequestContext input) {
         
         final ConsentContext consentContext = consentContextLookupStrategy.apply(input);
         if (consentContext != null && !consentContext.getCurrentConsents().isEmpty()) {
@@ -67,7 +67,7 @@ public class CurrentConsentValuesAuditExtractor implements Function<ProfileReque
                     map(Consent::getValue).
                     collect(Collectors.toList());
         }
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
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 a7e233c90..7f29e838e 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
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.consent.logic.impl;
 
 import java.security.NoSuchAlgorithmException;
-import java.util.Collections;
 import java.util.Locale;
 import java.util.Map;
 import java.util.function.Function;
@@ -38,6 +37,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.StringDigester;
 import net.shibboleth.shared.codec.StringDigester.OutputFormat;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -186,9 +186,9 @@ public class MessageSourceConsentFunction extends AbstractInitializableComponent
                 }
             }
     
-            return Collections.singletonMap(id, consent);
+            return CollectionSupport.singletonMap(id, consent);
         }
-        return Collections.emptyMap();
+        return CollectionSupport.emptyMap();
     }
     
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractorTest.java
index 0c3364ff5..2a01b3320 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIdsAuditExtractorTest.java
@@ -17,14 +17,13 @@
 
 package net.shibboleth.idp.consent.audit.impl;
 
-import java.util.Collections;
-import java.util.List;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /** {@link CurrentConsentIdsAuditExtractor} unit test. */
 @SuppressWarnings("javadoc")
@@ -40,10 +39,10 @@ public class CurrentConsentIdsAuditExtractorTest extends AbstractConsentAuditExt
         final ConsentContext ctx = prc.getSubcontext(ConsentContext.class);
         assert ctx != null;
         ctx.getCurrentConsents().clear();
-        Assert.assertEquals(extractor.apply(prc), Collections.emptyList());
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.emptyList());
     }
 
     @Test public void testExtraction() {
-        Assert.assertEquals(extractor.apply(prc), List.of("consent1", "consent2"));
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.listOf("consent1", "consent2"));
     }
-}
+}
\ No newline at end of file
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractorTest.java
index 66c4ec56a..39890ccf3 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentIsApprovedAuditExtractorTest.java
@@ -17,14 +17,12 @@
 
 package net.shibboleth.idp.consent.audit.impl;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /** {@link CurrentConsentIsApprovedAuditExtractor} unit test. */
 @SuppressWarnings("javadoc")
@@ -40,13 +38,13 @@ public class CurrentConsentIsApprovedAuditExtractorTest extends AbstractConsentA
         final ConsentContext ctx = prc.getSubcontext(ConsentContext.class);
         assert ctx != null;
         ctx.getCurrentConsents().clear();
-        Assert.assertEquals(extractor.apply(prc), Collections.emptyList());
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.emptyList());
     }
 
     @Test public void testExtraction() {
         final ConsentContext ctx = prc.getSubcontext(ConsentContext.class);
         assert ctx != null;
         ctx.getCurrentConsents().get("consent1").setApproved(true);
-        Assert.assertEquals(extractor.apply(prc), List.of(true, false));
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.listOf(true, false));
     }
 }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractorTest.java
index 88b4fa975..68ed27429 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/audit/impl/CurrentConsentValuesAuditExtractorTest.java
@@ -17,14 +17,12 @@
 
 package net.shibboleth.idp.consent.audit.impl;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.consent.context.ConsentContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /** {@link CurrentConsentValuesAuditExtractor} unit test. */
 @SuppressWarnings("javadoc")
@@ -40,10 +38,10 @@ public class CurrentConsentValuesAuditExtractorTest extends AbstractConsentAudit
         final ConsentContext ctx = prc.getSubcontext(ConsentContext.class);
         assert ctx != null;
         ctx.getCurrentConsents().clear();
-        Assert.assertEquals(extractor.apply(prc), Collections.emptyList());
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.emptyList());
     }
 
     @Test public void testExtraction() {
-        Assert.assertEquals(extractor.apply(prc), List.of("value1", "value2"));
+        Assert.assertEquals(extractor.apply(prc), CollectionSupport.listOf("value1", "value2"));
     }
 }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/context/impl/AttributeReleaseContextTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/context/impl/AttributeReleaseContextTest.java
index 2c912417d..6bba6e4c7 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/context/impl/AttributeReleaseContextTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/context/impl/AttributeReleaseContextTest.java
@@ -17,13 +17,13 @@
 
 package net.shibboleth.idp.consent.context.impl;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.consent.context.AttributeReleaseContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
@@ -47,10 +47,10 @@ public class AttributeReleaseContextTest {
 
     @Test public void testConsentableAttributes() {
         final IdPAttribute attr1 = new IdPAttribute("attr1");
-        attr1.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attr1.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         final IdPAttribute attr2 = new IdPAttribute("attr2");
-        attr2.setValues(Collections.singletonList(new StringAttributeValue("value2")));
+        attr2.setValues(CollectionSupport.singletonList(new StringAttributeValue("value2")));
 
         map = new HashMap<>();
         map.put(attr1.getId(), attr1);
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 a73f91b7d..45f74fe18 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
@@ -18,8 +18,6 @@
 package net.shibboleth.idp.consent.flow.ar.impl;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +41,7 @@ import net.shibboleth.idp.consent.logic.impl.PreferExplicitOrderComparator;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
 import net.shibboleth.profile.context.RelyingPartyContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link PopulateAttributeReleaseContext} unit test. */
@@ -106,7 +105,7 @@ public class PopulateAttributeReleaseContextTest extends AbstractAttributeReleas
 
     @Test public void testExplicitAttributeOrderingWithKnownAttributesOnly() throws Exception {
 
-        final List<String> attributeOrder = Arrays.asList("attribute2", "attribute3", "attribute1");
+        final List<String> attributeOrder = CollectionSupport.listOf("attribute2", "attribute3", "attribute1");
 
         final Map<String, IdPAttribute> orderedAttributes = new TreeMap<>(Ordering.explicit(attributeOrder));
         orderedAttributes.putAll(ConsentTestingSupport.newAttributeMap());
@@ -128,10 +127,10 @@ public class PopulateAttributeReleaseContextTest extends AbstractAttributeReleas
 
     @Test public void testExplicitAttributeOrderingWithUnknownAttributes() throws Exception {
 
-        final List<String> attributeOrder = Arrays.asList("attribute3", "attribute2");
+        final List<String> attributeOrder = CollectionSupport.listOf("attribute3", "attribute2");
 
         final IdPAttribute attribute4 = new IdPAttribute("attribute4");
-        attribute4.setValues(Collections.singletonList(new StringAttributeValue("value4")));
+        attribute4.setValues(CollectionSupport.singletonList(new StringAttributeValue("value4")));
 
         final Map<String, IdPAttribute> orderedAttributes = new LinkedHashMap<>();
         orderedAttributes.put("attribute3", ConsentTestingSupport.newAttributeMap().get("attribute3"));
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/RevokeConsentTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/RevokeConsentTest.java
index 9011cc0bd..8e997ea79 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/RevokeConsentTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/storage/impl/RevokeConsentTest.java
@@ -17,10 +17,10 @@
 
 package net.shibboleth.idp.consent.flow.storage.impl;
 
-import java.util.Collections;
 
 import net.shibboleth.idp.consent.impl.ConsentTestingSupport;
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.opensaml.storage.impl.MemoryStorageService;
 import org.springframework.webflow.execution.Event;
@@ -42,7 +42,7 @@ public class RevokeConsentTest extends AbstractConsentIndexedStorageActionTest {
         ss.create("context", "key", ConsentTestingSupport.newConsentMap(),
                 ((AbstractConsentStorageAction) action).getStorageSerializer(), null);
         Assert.assertNotNull(ss.read("context", "key"));
-        ss.create("context", "_index", Collections.singletonList("key"),
+        ss.create("context", "_index", CollectionSupport.singletonList("key"),
                 ((AbstractConsentIndexedStorageAction) action).getStorageKeysSerializer(), null);
 
         action.initialize();
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/impl/ConsentTestingSupport.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/impl/ConsentTestingSupport.java
index 9c03c23b9..7d5702c14 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/impl/ConsentTestingSupport.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/impl/ConsentTestingSupport.java
@@ -18,8 +18,6 @@
 package net.shibboleth.idp.consent.impl;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +29,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.consent.Consent;
 import net.shibboleth.idp.consent.storage.impl.ConsentResult;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  * Helper methods for creating test objects for consent action tests.
@@ -89,10 +88,10 @@ public class ConsentTestingSupport {
         attribute1.setValues(values);
 
         final IdPAttribute attribute2 = new IdPAttribute("attribute2");
-        attribute2.setValues(Arrays.asList(value1a, value2));
+        attribute2.setValues(CollectionSupport.listOf(value1a, value2));
 
         final IdPAttribute attribute3 = new IdPAttribute("attribute3");
-        attribute3.setValues(Collections.singletonList(value3));
+        attribute3.setValues(CollectionSupport.singletonList(value3));
 
         final Map<String, IdPAttribute> map = new HashMap<>();
         map.put(attribute1.getId(), attribute1);
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
index ff35118de..ce25f67fd 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.consent.logic.impl;
 
-import java.util.Collections;
 import java.util.Map;
 
 import net.shibboleth.idp.attribute.ByteAttributeValue;
@@ -28,6 +27,7 @@ import net.shibboleth.idp.consent.impl.ConsentTestingSupport;
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
 import net.shibboleth.idp.profile.testing.RequestContextBuilder;
 import net.shibboleth.profile.context.RelyingPartyContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -59,7 +59,7 @@ public class AttributeValueLookupFunctionTest {
         
         final Map<String, IdPAttribute> unfilteredAttributes = ConsentTestingSupport.newAttributeMap();
         final IdPAttribute attribute4 = new IdPAttribute("attribute4");
-        attribute4.setValues(Collections.singletonList(new StringAttributeValue("value4")));
+        attribute4.setValues(CollectionSupport.singletonList(new StringAttributeValue("value4")));
         unfilteredAttributes.put(attribute4.getId(), attribute4);
         attributeCtx.setUnfilteredIdPAttributes(unfilteredAttributes.values());
         
@@ -96,7 +96,7 @@ public class AttributeValueLookupFunctionTest {
         final AttributeContext attributeCtx =
                 prc.ensureSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
         assert attributeCtx!=null;
-        attributeCtx.setIdPAttributes(Collections.singleton(new IdPAttribute("EmptyAttribute")));
+        attributeCtx.setIdPAttributes(CollectionSupport.singleton(new IdPAttribute("EmptyAttribute")));
 
         function = new AttributeValueLookupFunction("EmptyAttribute");
         Assert.assertNull(function.apply(prc));
@@ -106,12 +106,12 @@ public class AttributeValueLookupFunctionTest {
         byte[] data = {1, 2, 3, 0xF};
 
         final IdPAttribute byteAttribute = new IdPAttribute("ByteAttribute");
-        byteAttribute.setValues(Collections.singletonList(new ByteAttributeValue(data)));
+        byteAttribute.setValues(CollectionSupport.singletonList(new ByteAttributeValue(data)));
 
         final AttributeContext attributeCtx =
                 prc.ensureSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
         assert attributeCtx!=null;
-        attributeCtx.setIdPAttributes(Collections.singleton(byteAttribute));
+        attributeCtx.setIdPAttributes(CollectionSupport.singleton(byteAttribute));
 
         function = new AttributeValueLookupFunction("ByteAttribute");
         Assert.assertNull(function.apply(prc));
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunctionTest.java
index 42ad93de6..8a6b28d4c 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValuesHashFunctionTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.consent.logic.impl;
 
 import static org.testng.Assert.assertEquals;
 
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -38,6 +37,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.ScopedStringAttributeValue;
 import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
 import net.shibboleth.idp.consent.impl.ConsentTestingSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /** {@link AttributeValuesHashFunction} unit test. */
 @SuppressWarnings("javadoc")
@@ -55,7 +55,7 @@ public class AttributeValuesHashFunctionTest extends XMLObjectBaseTestCase {
     }
 
     @Test public void testEmptyInput() {
-        Assert.assertNull(function.apply(Collections.emptyList()));
+        Assert.assertNull(function.apply(CollectionSupport.emptyList()));
     }
 
     @Test(enabled = true) public void testNullValue() {
@@ -82,14 +82,14 @@ public class AttributeValuesHashFunctionTest extends XMLObjectBaseTestCase {
     @Test public void testScoped() {
         // NOTE Any change is an ODS drift
         final IdPAttributeValue val = new ScopedStringAttributeValue("Value", "Scope");
-        assertEquals(function.apply(Collections.singletonList(val)), "WFoLzGdi3WmUjhWe3Q6uSyoHVZJXukDWeOUb7CyH5V8=");
+        assertEquals(function.apply(CollectionSupport.singletonList(val)), "WFoLzGdi3WmUjhWe3Q6uSyoHVZJXukDWeOUb7CyH5V8=");
     }
 
     @Test public void testByte() {
         // NOTE Any change is an ODS drift
         final byte[] theBytes = {1,2,3};
         final IdPAttributeValue val = new ByteAttributeValue(theBytes);
-        assertEquals(function.apply(Collections.singletonList(val)), "saP1UTQcyQPZHOPI6tVhVWMKOmB3BDCTn/l5QFSsyX4=");
+        assertEquals(function.apply(CollectionSupport.singletonList(val)), "saP1UTQcyQPZHOPI6tVhVWMKOmB3BDCTn/l5QFSsyX4=");
     }
 
     @Test public void testXML() {
@@ -100,7 +100,7 @@ public class AttributeValuesHashFunctionTest extends XMLObjectBaseTestCase {
         final XSString xmlString = builder.buildObject(XSString.TYPE_NAME);
         xmlString.setValue("value");
         final IdPAttributeValue val = new XMLObjectAttributeValue(xmlString);
-        assertEquals(function.apply(Collections.singletonList(val)), "c+NqWOijlvFBpla4r1q3F0RkpYZK7phCNe2gKb0r57o=");
+        assertEquals(function.apply(CollectionSupport.singletonList(val)), "c+NqWOijlvFBpla4r1q3F0RkpYZK7phCNe2gKb0r57o=");
     }
 
     private IdPAttributeValue testAV(@Nonnull Object type) {
@@ -116,11 +116,10 @@ public class AttributeValuesHashFunctionTest extends XMLObjectBaseTestCase {
     }
 
     @Test public void unknownTypeValue() {
-        assertEquals(function.apply(Collections.singletonList(testAV("42"))), "Lt6BAjtq4qQJ6ADEZKf/s5XZxzBh6mShY/UCphriugY=");
+        assertEquals(function.apply(CollectionSupport.singletonList(testAV("42"))), "Lt6BAjtq4qQJ6ADEZKf/s5XZxzBh6mShY/UCphriugY=");
     }
 
-    @SuppressWarnings("null")
     @Test public void unknownTypeNoValue() {
-        assertEquals(function.apply(Collections.singletonList(testAV(nullObj))), "xPtMT+sJsVtAtjNLzPrBBlfbY/yUsAQ7Ncxxc7Q5k70=");
+        assertEquals(function.apply(CollectionSupport.singletonList(testAV(nullObj))), "xPtMT+sJsVtAtjNLzPrBBlfbY/yUsAQ7Ncxxc7Q5k70=");
     }
 }
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
index 67b58830e..ac92b6c87 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparatorTest.java
@@ -27,6 +27,8 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /** {@link PreferExplicitOrderComparator} unit test. */
 @SuppressWarnings("javadoc")
 public class PreferExplicitOrderComparatorTest {
@@ -109,7 +111,7 @@ public class PreferExplicitOrderComparatorTest {
 
     @Test public void testExplicitOrderingWithWhitespaceInConstructor() {
 
-        c = new PreferExplicitOrderComparator(Arrays.asList(" first ", "\tmiddle", "last\n"));
+        c = new PreferExplicitOrderComparator(CollectionSupport.listOf(" first ", "\tmiddle", "last\n"));
 
         Collections.sort(toBeSorted, c);
 
@@ -121,7 +123,7 @@ public class PreferExplicitOrderComparatorTest {
         // natural ordering
         Collections.sort(expected);
     
-        c = new PreferExplicitOrderComparator(Collections.<String> emptyList());
+        c = new PreferExplicitOrderComparator(CollectionSupport.emptyList());
     
         Collections.sort(toBeSorted, c);
     
@@ -133,7 +135,7 @@ public class PreferExplicitOrderComparatorTest {
         // natural ordering
         Collections.sort(expected);
     
-        c = new PreferExplicitOrderComparator(Arrays.asList("not", "known"));
+        c = new PreferExplicitOrderComparator(CollectionSupport.listOf("not", "known"));
     
         Collections.sort(toBeSorted, c);
     
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializerTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializerTest.java
index 890e374a7..6c23127e3 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializerTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/storage/impl/CollectionSerializerTest.java
@@ -19,9 +19,7 @@ package net.shibboleth.idp.consent.storage.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
@@ -49,13 +47,13 @@ public class CollectionSerializerTest {
 
     @Test public void testEmpty() throws Exception {
         Assert.assertEquals(serializer.serialize(new ArrayList<String>()), "[]");
-        Assert.assertEquals(serializer.deserialize(-1, "context", "key", "[]", null), Collections.emptyList());
+        Assert.assertEquals(serializer.deserialize(-1, "context", "key", "[]", null), CollectionSupport.emptyList());
     }
 
     @SuppressWarnings("null")
     @Test public void testNullValue() throws Exception {
         Assert.assertEquals(serializer.serialize(CollectionSupport.<String> singletonList((String)nullObj)), "[]");
-        Assert.assertEquals(serializer.deserialize(-1, "context", "key", "[null]", null), Collections.emptyList());
+        Assert.assertEquals(serializer.deserialize(-1, "context", "key", "[null]", null), CollectionSupport.emptyList());
     }
 
     @Test public void testSimple() throws IOException {
diff --git a/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java b/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
index d08c79c4c..75e4992bf 100644
--- a/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
+++ b/idp-core/src/main/java/net/shibboleth/idp/spring/IdPPropertiesApplicationContextInitializer.java
@@ -29,7 +29,6 @@ import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TreeSet;
@@ -46,6 +45,7 @@ import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -249,7 +249,7 @@ public class IdPPropertiesApplicationContextInitializer
                 final String idpPropertiesNative = Path.of(IDP_PROPERTIES).toString();
                
                 try {
-                    Files.walkFileTree(searchRoot, Collections.singleton(FileVisitOption.FOLLOW_LINKS),
+                    Files.walkFileTree(searchRoot, CollectionSupport.singleton(FileVisitOption.FOLLOW_LINKS),
                             Integer.MAX_VALUE,
                             new FileVisitor<Path>() {
 
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/InstallerPropertiesImpl.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/InstallerPropertiesImpl.java
index c0ce97cb2..cd43968e0 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/InstallerPropertiesImpl.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/InstallerPropertiesImpl.java
@@ -45,6 +45,7 @@ import org.slf4j.Logger;
 import net.shibboleth.idp.installer.ant.impl.PasswordHandler;
 import net.shibboleth.idp.installer.impl.InstallationLogger;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.NonnullSupplier;
@@ -179,7 +180,7 @@ public class InstallerPropertiesImpl extends AbstractInitializableComponent impl
     private String credentialsKeyFileMode;
 
     /** Local overload of properties (to deal with nested calling). */
-    private Map<String, String> inheritedProperties = Collections.emptyMap();
+    private Map<String, String> inheritedProperties;
 
     /** Input handler from the prompting. */
     private final InputHandler inputHandler;
@@ -191,6 +192,7 @@ public class InstallerPropertiesImpl extends AbstractInitializableComponent impl
     public InstallerPropertiesImpl(final boolean copiedDistribution) {
         needSourceDir = !copiedDistribution;
         inputHandler = getInputHandler();
+        inheritedProperties = CollectionSupport.emptyMap();
     }
 
     /** Get an {@link InputHandler} for the prompting.
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
index 4a24886a0..a8e5a6945 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/V4Install.java
@@ -29,7 +29,6 @@ import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Properties;
 import java.util.ServiceConfigurationError;
@@ -162,7 +161,7 @@ public class V4Install extends AbstractInitializableComponent {
             final PluginVersion pluginVersion = new PluginVersion(plugin);
             try {
                 log.debug("Considering Plugin {}, version {}", pluginId,  pluginVersion);
-                final PluginState state = new PluginState(plugin, Collections.emptyList());
+                final PluginState state = new PluginState(plugin, CollectionSupport.emptyList());
                 state.initialize();
                 if (!state.getPluginInfo().isSupportedWithIdPVersion(pluginVersion, idpVersion)) {
                     log.warn("Installed Plugin {} version {} is not supported with IdP Version {}, continuing.",
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
index 46af3f8f0..2c78c1100 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/impl/CurrentInstallStateImpl.java
@@ -33,7 +33,6 @@ import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -55,6 +54,7 @@ import net.shibboleth.idp.module.IdPModule;
 import net.shibboleth.idp.module.ModuleContext;
 import net.shibboleth.idp.spring.IdPPropertiesApplicationContextInitializer;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -72,7 +72,7 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
     private final String[][] deleteAfterUpgrades = { { "credentials", "secrets.properties", }, };
 
     /** The module IDs which are enabled. */
-    private Set<String> enabledModules = Collections.emptySet();
+    private Set<String> enabledModules;
 
     /** Whether the IdP properties file exists.*/
     private boolean idpPropertiesPresent;
@@ -100,6 +100,7 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
      */
     public CurrentInstallStateImpl(final InstallerProperties installerProps) {
         targetDir = installerProps.getTargetDir();
+        enabledModules = CollectionSupport.emptySet();
     }
 
     /** Work out what the "current" install state is (before we do any more work).
@@ -212,7 +213,7 @@ public final class CurrentInstallStateImpl extends AbstractInitializableComponen
 
         if (null == getInstalledVersion()) {
             // New install.  We need all files
-            pathsToDelete = Collections.emptyList();
+            pathsToDelete = CollectionSupport.emptyList();
         } else {
             pathsToDelete = new ArrayList<>();
             for (int i = 0; i < deleteAfterUpgrades.length; i++) {
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorImpl.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorImpl.java
index f8ec94c96..968fb0396 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorImpl.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/metadata/impl/MetadataGeneratorImpl.java
@@ -25,8 +25,6 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
@@ -62,6 +60,7 @@ import net.shibboleth.idp.saml.xmlobject.ExtensionsConstants;
 import net.shibboleth.idp.saml.xmlobject.Scope;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -364,9 +363,9 @@ public class MetadataGeneratorImpl extends AbstractInitializableComponent implem
     protected void writeIDPSSO() throws IOException {
         final List<String> protocols;
         if (isSAML1Commented()) {
-            protocols = Collections.singletonList(SAMLConstants.SAML20P_NS);
+            protocols = CollectionSupport.singletonList(SAMLConstants.SAML20P_NS);
         } else {
-            protocols = Arrays.asList(SAMLConstants.SAML20P_NS, SAMLConstants.SAML11P_NS, "urn:mace:shibboleth:1.0");
+            protocols = CollectionSupport.listOf(SAMLConstants.SAML20P_NS, SAMLConstants.SAML11P_NS, "urn:mace:shibboleth:1.0");
         }
 
         writeRoleDescriptor(IDPSSODescriptor.DEFAULT_ELEMENT_LOCAL_NAME, protocols); 
@@ -421,9 +420,9 @@ public class MetadataGeneratorImpl extends AbstractInitializableComponent implem
         }
         final List<String> protocols;
         if (isSAML2AttributeQueryCommented()) {
-            protocols = Collections.singletonList(SAMLConstants.SAML11P_NS);
+            protocols = CollectionSupport.singletonList(SAMLConstants.SAML11P_NS);
         } else {
-            protocols = Arrays.asList(SAMLConstants.SAML20P_NS, SAMLConstants.SAML11P_NS);
+            protocols = CollectionSupport.listOf(SAMLConstants.SAML20P_NS, SAMLConstants.SAML11P_NS);
         }
         writeRoleDescriptor(AttributeAuthorityDescriptor.DEFAULT_ELEMENT_LOCAL_NAME, protocols);
         writer.newLine();
@@ -614,7 +613,11 @@ public class MetadataGeneratorImpl extends AbstractInitializableComponent implem
             signing.add(signingCert);
         }
         writeKeyDescriptors(signing, "signing");
-        writeKeyDescriptors(Collections.singletonList(params.getEncryptionCert()), "encryption");
+        
+        final List<String> encryption = params.getEncryptionCert();
+        if (encryption != null) {
+            writeKeyDescriptors(CollectionSupport.singletonList(encryption), "encryption");
+        }
         writer.newLine();
     }
 
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstaller.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstaller.java
index f886131fd..4e03a8706 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstaller.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstaller.java
@@ -34,7 +34,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -88,6 +87,7 @@ import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resource.Resource;
 import net.shibboleth.shared.spring.httpclient.resource.HTTPResource;
+
 /**
  *  The class where the heavy lifting of managing a plugin happens. 
  */
@@ -631,7 +631,7 @@ public final class PluginInstaller extends AbstractInitializableComponent implem
         final File inFile = pluginsContents.resolve(pluginId).toFile();
         if (!inFile.exists()) {
             LOG.debug("Contents file for plugin {} ({}) does not exist", pluginId, inFile.getAbsolutePath());
-            installedContents = Collections.emptyList();
+            installedContents = CollectionSupport.emptyList();
             return;
         }
         try (final BufferedInputStream inStream = new BufferedInputStream(new FileInputStream(inFile))) {
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerCLI.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerCLI.java
index 57021d446..8b472e272 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerCLI.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerCLI.java
@@ -26,7 +26,6 @@ import java.net.URL;
 import java.nio.file.Path;
 import java.security.Security;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -137,7 +136,7 @@ public final class PluginInstallerCLI extends AbstractIdPHomeAwareCommandLine<Pl
                 return RC_INIT;
             }
         } else {
-            updateURLs = Collections.emptyList();
+            updateURLs = CollectionSupport.emptyList();
         }
 
         try (final PluginInstaller inst = new PluginInstaller(Constraint.isNotNull(getHttpClient(), "HJttpClient cannot be non null (by construction"))) {
diff --git a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/TrustStore.java b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/TrustStore.java
index f78cf17e5..36b5b6525 100644
--- a/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/TrustStore.java
+++ b/idp-installer/src/main/java/net/shibboleth/idp/installer/plugin/impl/TrustStore.java
@@ -24,7 +24,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.function.Predicate;
 
@@ -49,6 +48,7 @@ import org.slf4j.Logger;
 
 import net.shibboleth.idp.installer.impl.InstallationLogger;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -154,7 +154,7 @@ import net.shibboleth.shared.logic.Constraint;
      *  has problems.
      */
     protected void createNewStore() throws IOException {
-        keyRings = new PGPPublicKeyRingCollection(Collections.emptyList());
+        keyRings = new PGPPublicKeyRingCollection(CollectionSupport.emptyList());
         saveStoreInternal();
     }
 
@@ -231,7 +231,7 @@ import net.shibboleth.shared.logic.Constraint;
         }
         keyRings = PGPPublicKeyRingCollection.addPublicKeyRing(
                 keyRings,
-                new PGPPublicKeyRing(Collections.singletonList(key)));
+                new PGPPublicKeyRing(CollectionSupport.singletonList(key)));
         saveStoreInternal();
     }
 
diff --git a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerTest.java b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerTest.java
index 7d67b0066..03a204512 100644
--- a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerTest.java
+++ b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginInstallerTest.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.net.URL;
 import java.nio.file.Path;
 import java.security.Security;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
@@ -39,6 +38,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.plugin.AbstractIdPPlugin;
 import net.shibboleth.idp.plugin.IdPPlugin;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.httpclient.HttpClientBuilder;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -132,7 +132,7 @@ public class PluginInstallerTest extends BasePluginTest {
 
         /** {@inheritDoc} */
         public @Nonnull List<URL> getUpdateURLs() throws IOException {
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
 
         /** {@inheritDoc} */
diff --git a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginStateTest.java b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginStateTest.java
index 4dc8d26b1..65f0569a7 100644
--- a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginStateTest.java
+++ b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/PluginStateTest.java
@@ -25,7 +25,6 @@ import static org.testng.Assert.fail;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -34,6 +33,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.plugin.IdPPlugin;
 import net.shibboleth.idp.plugin.PluginVersion;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -52,7 +52,7 @@ public class PluginStateTest {
 
         final IdPPlugin simple = new TestPlugin();
         
-        final PluginState state = new PluginState(simple, Collections.EMPTY_LIST);
+        final PluginState state = new PluginState(simple, CollectionSupport.emptyList());
         
         state.initialize();
 
@@ -120,7 +120,7 @@ public class PluginStateTest {
             }
         };
         
-        final PluginState state = new PluginState(simple, Collections.EMPTY_LIST);
+        final PluginState state = new PluginState(simple, CollectionSupport.emptyList());
         state.initialize();
         
         assertEquals(state.getPluginInfo().getAvailableVersions().size(), 3);
diff --git a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestModule.java b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestModule.java
index ecaf8dc8e..cfff1fcf4 100644
--- a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestModule.java
+++ b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestModule.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.installer.plugin.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -27,6 +26,7 @@ import javax.annotation.Nullable;
 import net.shibboleth.idp.module.IdPModule;
 import net.shibboleth.idp.module.ModuleContext;
 import net.shibboleth.idp.module.ModuleException;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 @SuppressWarnings("javadoc")
 public class TestModule implements IdPModule {
@@ -74,31 +74,31 @@ public class TestModule implements IdPModule {
 
     /** {@inheritDoc} */
     public @Nonnull Collection<ModuleResource> getResources() {
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
     /** {@inheritDoc} */
-    public boolean isEnabled(ModuleContext moduleContext) {
+    public boolean isEnabled(@Nonnull final ModuleContext moduleContext) {
         return enabled;
     }
 
     /** {@inheritDoc} */
-    public @Nonnull Map<ModuleResource, ResourceResult> enable(ModuleContext moduleContext) throws ModuleException {
+    public @Nonnull Map<ModuleResource, ResourceResult> enable(@Nonnull final ModuleContext moduleContext) throws ModuleException {
         if (throwOnEnable != null) {
             throw throwOnEnable;
         }
         enabled = true;
-        return Collections.emptyMap();
+        return CollectionSupport.emptyMap();
     }
 
     /** {@inheritDoc} */
-    public @Nonnull Map<ModuleResource, ResourceResult> disable(ModuleContext moduleContext, boolean clean)
+    public @Nonnull Map<ModuleResource, ResourceResult> disable(@Nonnull final ModuleContext moduleContext, boolean clean)
             throws ModuleException {
         if (throwOnDisable != null) {
             throw throwOnDisable;
         }
         enabled = false;
-        return Collections.emptyMap();
+        return CollectionSupport.emptyMap();
     }
     
 }
\ No newline at end of file
diff --git a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestPlugin.java b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestPlugin.java
index 4ac211b1c..9a3896a87 100644
--- a/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestPlugin.java
+++ b/idp-installer/src/test/java/net/shibboleth/idp/installer/plugin/impl/TestPlugin.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.installer.plugin.impl;
 
 import java.io.IOException;
 import java.net.URL;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -27,6 +26,7 @@ import javax.annotation.Nonnull;
 import org.springframework.core.io.ClassPathResource;
 
 import net.shibboleth.idp.plugin.AbstractIdPPlugin;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  *
@@ -44,9 +44,9 @@ public class TestPlugin extends AbstractIdPPlugin {
     public @Nonnull List<URL> getUpdateURLs() {
         ClassPathResource resource = new ClassPathResource("/net/shibboleth/idp/plugin/plugins.props");
         try {
-            return Collections.singletonList(resource.getURL());
+            return CollectionSupport.singletonList(resource.getURL());
         } catch (IOException e) {
-            return Collections.EMPTY_LIST;
+            return CollectionSupport.emptyList();
         }
     }
     
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/InboundFlowsLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/InboundFlowsLookupFunction.java
index d31d0b380..d82db9487 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/InboundFlowsLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/InboundFlowsLookupFunction.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.profile.config.navigate;
 
 import java.util.Collection;
-import java.util.Collections;
 
 import javax.annotation.Nullable;
 
@@ -29,6 +28,7 @@ import net.shibboleth.idp.profile.config.InterceptorAwareProfileConfiguration;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -48,12 +48,12 @@ public class InboundFlowsLookupFunction extends AbstractRelyingPartyLookupFuncti
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
-            if (pc instanceof InterceptorAwareProfileConfiguration) {
-                return ((InterceptorAwareProfileConfiguration) pc).getInboundInterceptorFlows(input);
+            if (pc instanceof InterceptorAwareProfileConfiguration ipc) {
+                return ipc.getInboundInterceptorFlows(input);
             }
         }
         
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/OutboundFlowsLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/OutboundFlowsLookupFunction.java
index 1336f5f44..3387a1809 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/OutboundFlowsLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/config/navigate/OutboundFlowsLookupFunction.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.profile.config.navigate;
 
 import java.util.Collection;
-import java.util.Collections;
 
 import javax.annotation.Nullable;
 
@@ -29,6 +28,7 @@ import net.shibboleth.idp.profile.config.InterceptorAwareProfileConfiguration;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
@@ -48,12 +48,12 @@ public class OutboundFlowsLookupFunction extends AbstractRelyingPartyLookupFunct
         final RelyingPartyContext rpc = getRelyingPartyContextLookupStrategy().apply(input);
         if (rpc != null) {
             final ProfileConfiguration pc = rpc.getProfileConfig();
-            if (pc instanceof InterceptorAwareProfileConfiguration) {
-                return ((InterceptorAwareProfileConfiguration) pc).getOutboundInterceptorFlows(input);
+            if (pc instanceof InterceptorAwareProfileConfiguration ipc) {
+                return ipc.getOutboundInterceptorFlows(input);
             }
         }
         
-        return Collections.emptyList();
+        return CollectionSupport.emptyList();
     }
 
 }
\ No newline at end of file
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 d1c009d0e..95dbf21ad 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,7 +17,6 @@
 
 package net.shibboleth.idp.profile.impl;
 
-import java.util.Collections;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
@@ -47,6 +46,7 @@ import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.profile.context.navigate.IssuerLookupFunction;
 import net.shibboleth.profile.context.navigate.RelyingPartyIdLookupFunction;
 import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.service.ReloadableService;
@@ -151,8 +151,9 @@ public class FilterAttributes extends AbstractProfileAction {
         issuerLookupStrategy = new IssuerLookupFunction();
         recipientLookupStrategy = new RelyingPartyIdLookupFunction();
         
-        final Function<ProfileRequestContext,AttributeContext> acls = new ChildContextLookup<>(AttributeContext.class).compose(
-                new ChildContextLookup<>(RelyingPartyContext.class));
+        final Function<ProfileRequestContext,AttributeContext> acls =
+                new ChildContextLookup<>(AttributeContext.class).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         assert acls != null;
         attributeContextLookupStrategy = acls; 
 
@@ -165,13 +166,14 @@ public class FilterAttributes extends AbstractProfileAction {
         profileRequestContextFromFilterLookupStrategy = new RootContextLookup<>(ProfileRequestContext.class);
                 
         // Default: inbound msg context -> SAMLPeerEntityContext -> SAMLMetadataContext
-        final Function<ProfileRequestContext,SAMLMetadataContext> metadataContextLookupStrategy = new ChildContextLookup<>(SAMLMetadataContext.class).compose(
-                new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
-                        new InboundMessageContextLookup()));
+        final Function<ProfileRequestContext,SAMLMetadataContext> metadataContextLookupStrategy =
+                new ChildContextLookup<>(SAMLMetadataContext.class).compose(
+                        new ChildContextLookup<>(SAMLPeerEntityContext.class).compose(
+                                new InboundMessageContextLookup()));
         assert metadataContextLookupStrategy != null;
         
         // This is always set to navigate to the PRC and then apply the previous function.
-        Function<AttributeFilterContext,SAMLMetadataContext> mffls = metadataContextLookupStrategy.compose(
+        final Function<AttributeFilterContext,SAMLMetadataContext> mffls = metadataContextLookupStrategy.compose(
                 profileRequestContextFromFilterLookupStrategy);
         assert mffls != null;
         metadataFromFilterLookupStrategy = mffls; 
@@ -183,14 +185,15 @@ public class FilterAttributes extends AbstractProfileAction {
         proxiedRequesterContextLookupStrategy = prcls;
         
         // This is always set to navigate to the PRC and then apply the previous function.
-        final Function<AttributeFilterContext,ProxiedRequesterContext> pffls = proxiedRequesterContextLookupStrategy.compose(
-                profileRequestContextFromFilterLookupStrategy);
+        final Function<AttributeFilterContext,ProxiedRequesterContext> pffls =
+                proxiedRequesterContextLookupStrategy.compose(profileRequestContextFromFilterLookupStrategy);
         assert pffls != null;
         proxiesFromFilterLookupStrategy = pffls; 
         
         // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeFilterContext.
-        final Function<ProfileRequestContext,AttributeFilterContext> fccs = new ChildContextLookup<>(AttributeFilterContext.class, true).compose(
-                new ChildContextLookup<>(RelyingPartyContext.class));
+        final Function<ProfileRequestContext,AttributeFilterContext> fccs =
+                new ChildContextLookup<>(AttributeFilterContext.class, true).compose(
+                        new ChildContextLookup<>(RelyingPartyContext.class));
         assert fccs != null;
         filterContextCreationStrategy = fccs; 
         
@@ -289,8 +292,9 @@ public class FilterAttributes extends AbstractProfileAction {
     public void setMetadataContextLookupStrategy(
             @Nonnull final Function<ProfileRequestContext,SAMLMetadataContext> strategy) {
         checkSetterPreconditions();
-        final Function<AttributeFilterContext,SAMLMetadataContext> mffls = strategy.compose(profileRequestContextFromFilterLookupStrategy);
-        assert mffls!=null;
+        final Function<AttributeFilterContext,SAMLMetadataContext> mffls =
+                strategy.compose(profileRequestContextFromFilterLookupStrategy);
+        assert mffls != null;
         metadataFromFilterLookupStrategy = mffls;
                 
     }
@@ -393,7 +397,7 @@ public class FilterAttributes extends AbstractProfileAction {
             log.error("{} Error encountered while filtering attributes", getLogPrefix(), e);
             if (maskFailures) {
                 log.warn("Filter error masked, clearing resolved attributes");
-                attributeContext.setIdPAttributes(Collections.emptySet());
+                attributeContext.setIdPAttributes(CollectionSupport.emptySet());
             } else {
                 ActionSupport.buildEvent(profileRequestContext, IdPEventIds.UNABLE_FILTER_ATTRIBS);
             }
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 8d73341dc..0ed77c0cb 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
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.profile.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
@@ -44,6 +43,7 @@ import net.shibboleth.profile.context.RelyingPartyContext;
 import net.shibboleth.profile.context.navigate.RelyingPartyIdLookupFunction;
 import net.shibboleth.profile.context.navigate.IssuerLookupFunction;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.FunctionSupport;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -115,7 +115,7 @@ public final class ResolveAttributes extends AbstractProfileAction {
         attributeContextCreationStrategy = new ChildContextLookup<>(AttributeContext.class, true).compose(
                 new ChildContextLookup<>(RelyingPartyContext.class));
         
-        attributesLookupStrategy = FunctionSupport.constant(Collections.emptyList());
+        attributesLookupStrategy = FunctionSupport.constant(CollectionSupport.emptyList());
         
         maskFailures = true;
         createResolutionContext = true;
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 7c5975ca4..0bf8a7086 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
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.profile.audit.impl;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
@@ -60,7 +58,7 @@ public class PopulateAuditContextTest {
     
     @Test public void testSingle() throws Exception {
         final Map<String,Function<ProfileRequestContext,Object>> map = new HashMap<>();
-        map.put("a", new MockFunction(Collections.singletonList("foo")));
+        map.put("a", new MockFunction(CollectionSupport.singletonList("foo")));
         
         action.setFieldExtractors(map);
         action.initialize();
@@ -77,8 +75,8 @@ public class PopulateAuditContextTest {
 
     @Test public void testMultiple() throws Exception {
         final Map<String,Function<ProfileRequestContext,Object>> map = new HashMap<>();
-        map.put("a", new MockFunction(Collections.singletonList("foo")));
-        map.put("A", new MockFunction(Arrays.asList("bar", "baz")));
+        map.put("a", new MockFunction(CollectionSupport.singletonList("foo")));
+        map.put("A", new MockFunction(CollectionSupport.listOf("bar", "baz")));
         
         action.setFieldExtractors(map);
         action.initialize();
@@ -97,8 +95,8 @@ public class PopulateAuditContextTest {
 
     @Test public void testSkipped() throws Exception {
         final Map<String,Function<ProfileRequestContext,Object>> map = new HashMap<>();
-        map.put("a", new MockFunction(Collections.singletonList("foo")));
-        map.put("A", new MockFunction(Arrays.asList("bar", "baz")));
+        map.put("a", new MockFunction(CollectionSupport.singletonList("foo")));
+        map.put("A", new MockFunction(CollectionSupport.listOf("bar", "baz")));
         
         action.setFieldExtractors(map);
         action.setFormattingMapParser(new FormattingMapParser(CollectionSupport.singletonMap("foo", "%A - %b %%")));
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
index 22a0095c6..c401b8d52 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.profile.audit.impl;
 
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -34,6 +33,7 @@ import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileR
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
 import net.shibboleth.idp.profile.testing.RequestContextBuilder;
 import net.shibboleth.profile.context.AuditContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 
@@ -72,32 +72,32 @@ public class WriteAuditLogTest {
     }
 
     @Test public void testFormat() {
-        action.setFormattingMap(Collections.singletonMap("category", "Foo"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "Foo"));
         List<String> format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 1);
         Assert.assertEquals(format.get(0), "Foo");
 
-        action.setFormattingMap(Collections.singletonMap("category", "%Foo"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%Foo"));
         format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 1);
         Assert.assertEquals(format.get(0), "%Foo");
 
-        action.setFormattingMap(Collections.singletonMap("category", "%Foo|%Bar %Baz%Bat"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%Foo|%Bar %Baz%Bat"));
         format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 5);
         Assert.assertEquals(format.toArray(), new String[]{"%Foo", "|", "%Bar", " ", "%Baz%Bat"});
 
-        action.setFormattingMap(Collections.singletonMap("category", "%Foo|%Bar %Baz-Bat"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%Foo|%Bar %Baz-Bat"));
         format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 5);
         Assert.assertEquals(format.toArray(), new String[]{"%Foo", "|", "%Bar", " ", "%Baz-Bat"});
 
-        action.setFormattingMap(Collections.singletonMap("category", "%Foo|%Bar %%%"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%Foo|%Bar %%%"));
         format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 5);
         Assert.assertEquals(format.toArray(), new String[]{"%Foo", "|", "%Bar", " ", "%%%"});
 
-        action.setFormattingMap(Collections.singletonMap("category", "%Foo|%Bar % %%"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%Foo|%Bar % %%"));
         format = action.getFormattingMap().get("category");
         Assert.assertEquals(format.size(), 7);
         Assert.assertEquals(format.toArray(), new String[]{"%Foo", "|", "%Bar", " ", "%", " ", "%%"});
@@ -109,7 +109,7 @@ public class WriteAuditLogTest {
         ac.getFieldValues("B").add("bar");
         ac.getFieldValues("B").add("baz");
         
-        action.setFormattingMap(Collections.singletonMap("category", "%A %B"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%A %B"));
         action.initialize();
         
         final Event event = action.execute(src);
@@ -123,7 +123,7 @@ public class WriteAuditLogTest {
         ac.getFieldValues("B").add("bar");
         ac.getFieldValues("B").add("baz");
         
-        action.setFormattingMap(Collections.singletonMap("category", "%A - %C|%B"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%A - %C|%B"));
         action.initialize();
         
         final Event event = action.execute(src);
@@ -132,7 +132,7 @@ public class WriteAuditLogTest {
     }
     
     @Test public void testServletRequest() throws ComponentInitializationException {
-        action.setFormattingMap(Collections.singletonMap("category", "%a %URL - %UA"));
+        action.setFormattingMap(CollectionSupport.singletonMap("category", "%a %URL - %UA"));
         action.initialize();
         
         final Event event = action.execute(src);
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/SelectProfileConfigurationTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/SelectProfileConfigurationTest.java
index de76fa8c5..441512d3d 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/SelectProfileConfigurationTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/impl/SelectProfileConfigurationTest.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.profile.impl;
 
-import java.util.Collections;
-
 import net.shibboleth.idp.profile.IdPEventIds;
 
 import org.opensaml.profile.context.ProfileRequestContext;
@@ -29,6 +27,7 @@ import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileR
 import net.shibboleth.idp.profile.testing.ActionTestingSupport;
 import net.shibboleth.idp.profile.testing.MockProfileConfiguration;
 import net.shibboleth.idp.profile.testing.RequestContextBuilder;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 import org.springframework.webflow.execution.Event;
@@ -96,7 +95,7 @@ public class SelectProfileConfigurationTest {
      */
     @Test public void testInvalidProfileConfiguration() throws Exception {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
+                CollectionSupport.singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx != null;
@@ -118,7 +117,7 @@ public class SelectProfileConfigurationTest {
        action.initialize();        
 
        src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-               Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
+               CollectionSupport.singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
        prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
        final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
        assert rpCtx != null;
@@ -136,7 +135,7 @@ public class SelectProfileConfigurationTest {
      */
     @Test public void testSelectProfileConfiguration() throws Exception {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
+                CollectionSupport.singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx != null;
@@ -160,7 +159,7 @@ public class SelectProfileConfigurationTest {
      */
     @Test public void testFallback() throws Exception {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
-                Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
+                CollectionSupport.singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx != null;
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContextTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContextTest.java
index 8c2e5468c..9a6917dc7 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContextTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContextTest.java
@@ -17,9 +17,6 @@
 
 package net.shibboleth.idp.profile.interceptor.impl;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -66,8 +63,7 @@ public class PopulateProfileInterceptorContextTest {
 
         final PopulateProfileInterceptorContext action = new PopulateProfileInterceptorContext();
         action.setAvailableFlows(interceptorFlows);
-        action.setActiveFlowsLookupStrategy(FunctionSupport.<ProfileRequestContext, Collection<String>> constant(Arrays
-                .asList("test1", "test2", "test3")));
+        action.setActiveFlowsLookupStrategy(FunctionSupport.constant(CollectionSupport.listOf("test1", "test2", "test3")));
         action.initialize();
 
         final Event event = action.execute(src);
@@ -98,8 +94,7 @@ public class PopulateProfileInterceptorContextTest {
     @Test public void testError() throws Exception {
         final PopulateProfileInterceptorContext action = new PopulateProfileInterceptorContext();
         action.setAvailableFlows(interceptorFlows);
-        action.setActiveFlowsLookupStrategy(FunctionSupport
-                .<ProfileRequestContext, Collection<String>> constant(Collections.singletonList("test4")));
+        action.setActiveFlowsLookupStrategy(FunctionSupport.constant(CollectionSupport.singletonList("test4")));
         action.initialize();
 
         final Event event = action.execute(src);

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


More information about the commits mailing list