[java-shib-attribute] branch main updated: Replace Collections/Arrays methods where possible.

Scott Cantor cantor.2 at osu.edu
Thu Apr 20 18:48:25 UTC 2023


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=e1075d6635898bc66053def8f57cce3861a068ae

The following commit(s) were added to refs/heads/main by this push:
     new e1075d663 Replace Collections/Arrays methods where possible.
e1075d663 is described below

commit e1075d6635898bc66053def8f57cce3861a068ae
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Apr 20 14:48:22 2023 -0400

    Replace Collections/Arrays methods where possible.
---
 ...tMetadataDrivenConfigurationLookupStrategy.java |  8 +--
 .../idp/attribute/AttributeContextTest.java        |  6 +--
 .../shibboleth/idp/attribute/AttributeTest.java    |  8 +--
 .../shibboleth/idp/attribute/filter/Matcher.java   | 31 ++++++-----
 .../filter/context/AttributeFilterWorkContext.java | 18 ++++---
 .../context/AttributeFilterWorkContextTest.java    | 22 ++++----
 .../filter/matcher/impl/AbstractMatcher.java       | 11 ++--
 .../filter/matcher/impl/ScriptedMatcher.java       | 10 ++--
 .../logic/impl/AbstractComposedMatcher.java        |  5 +-
 .../filter/matcher/logic/impl/AndMatcher.java      |  9 ++--
 .../filter/matcher/logic/impl/NotMatcher.java      |  9 ++--
 .../filter/matcher/logic/impl/OrMatcher.java       |  7 +--
 .../impl/AbstractMatchesShibMDScopeMatcher.java    | 12 ++---
 .../logic/impl/AbstractComposedPolicyRule.java     | 12 +++--
 .../saml/impl/AbstractEntityGroupPolicyRule.java   |  4 +-
 .../impl/TargettedAttributeValueFilterTest.java    | 14 ++---
 .../impl/UntargettedAttributeValueFilterTest.java  | 10 ++--
 .../filter/impl/AttributeFilterImplTest.java       | 63 +++++++++++-----------
 .../filter/matcher/impl/ScriptedMatcherTest.java   |  4 +-
 .../logic/impl/AbstractComposedMatcherTest.java    |  4 +-
 .../filter/matcher/logic/impl/OrMatcherTest.java   |  5 +-
 .../saml/impl/AttributeInMetadataMatcherTest.java  | 23 ++++----
 .../impl/MappedAttributeInMetadataMatcherTest.java | 21 ++++----
 .../impl/NumOfAttributeValuesPolicyRuleTest.java   |  4 +-
 .../logic/impl/AbstractComposedPolicyRuleTest.java |  4 +-
 .../policyrule/logic/impl/AndPolicyRuleTest.java   | 20 +++----
 .../policyrule/logic/impl/OrPolicyRuleTest.java    | 19 ++++---
 .../policyrule/saml/impl/BaseMetadataTests.java    |  8 ++-
 .../filter/tests/AttributeFilterPolicyTest.java    | 34 ++++++------
 .../filter/spring/AttributeFilterServiceTest.java  | 11 ++--
 .../impl/AttributeRegistryServiceStrategy.java     |  4 +-
 .../impl/ComputedPairwiseIdStoreTest.java          | 18 +++----
 .../impl/AttributeTranscoderRegistryImplTest.java  |  9 ++--
 .../attribute/transcoding/impl/PairTranscoder.java | 10 ++--
 .../context/AttributeResolverWorkContext.java      | 15 +++---
 .../resolver/AbstractDataConnectorTest.java        |  5 +-
 .../resolver/ad/mapped/impl/ValueMap.java          |  3 +-
 .../resolver/dc/impl/PairwiseIdDataConnector.java  |  3 +-
 .../storage/impl/SimpleStorageMappingStrategy.java |  6 +--
 .../storage/impl/StorageServiceDataConnector.java  |  4 +-
 .../ad/impl/DateTimeAttributeDefinitionTest.java   |  4 +-
 .../resolver/ad/impl/DecryptedAttributeTest.java   |  8 +--
 .../resolver/ad/impl/PrescopedAtributeTest.java    | 24 ++++-----
 .../resolver/ad/impl/RegexAtributeTest.java        | 10 ++--
 .../resolver/ad/impl/ScopedAttributeTest.java      |  3 +-
 .../resolver/ad/impl/ScriptedAttributeTest.java    | 24 ++++-----
 .../resolver/ad/impl/SimpleAttributeTest.java      |  3 +-
 .../resolver/ad/impl/TemplateAttributeTest.java    | 11 ++--
 .../ad/mapped/impl/MappedAttributeTest.java        | 42 +++++++--------
 .../resolver/ad/mapped/impl/ValueMapTest.java      |  6 +--
 .../dc/http/impl/HTTPDataConnectorTest.java        | 48 ++++++++---------
 .../dc/impl/ComputedIDDataConnectorTest.java       | 24 ++++-----
 .../dc/impl/ScriptedDataConnectorTest.java         |  4 +-
 .../dc/ldap/impl/LDAPDataConnectorTest.java        |  6 +--
 .../dc/rdbms/impl/RDBMSDataConnectorTest.java      |  4 +-
 .../resolver/impl/AttributeResolverImplTest.java   | 55 ++++++++++---------
 .../tests/AttributeResolverWorkContextTest.java    |  4 +-
 .../tests/PluginDependencySupportTest.java         | 55 ++++++++++---------
 .../tests/ResolvedAttributeDefinitionTest.java     | 10 ++--
 .../resolver/tests/ResolvedDataConnectorTest.java  | 21 ++++----
 .../spring/AttributeMappingNodeProcessorTest.java  |  8 ++-
 .../idp/attribute/filter/testing/MockMatcher.java  | 10 ++--
 .../SAML1NameIdentifierAttributeDefinition.java    |  4 +-
 .../impl/SAML2NameIDAttributeDefinition.java       |  4 +-
 .../impl/SAML1ByteAttributeTranscoderTest.java     | 12 ++---
 .../SAML1ScopedStringAttributeTranscoderTest.java  | 12 ++---
 .../impl/SAML1StringAttributeTranscoderTest.java   | 12 ++---
 .../impl/SAML2ByteAttributeTranscoderTest.java     | 12 ++---
 .../impl/SAML2DateTimeAttributeTranscoderTest.java |  3 +-
 .../SAML2ScopedStringAttributeTranscoderTest.java  | 12 ++---
 .../impl/SAML2StringAttributeTranscoderTest.java   |  3 +-
 .../SAML2XMLObjectAttributeTranscoderTest.java     |  5 +-
 72 files changed, 468 insertions(+), 488 deletions(-)

diff --git a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
index 286f71b9a..2fa58b602 100644
--- a/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
+++ b/shib-attribute-api/src/main/java/net/shibboleth/idp/attribute/config/AbstractMetadataDrivenConfigurationLookupStrategy.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.config;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,6 +48,7 @@ import net.shibboleth.shared.annotation.constraint.Live;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LockableClassToInstanceMultiMap;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -293,20 +293,20 @@ public abstract class AbstractMetadataDrivenConfigurationLookupStrategy<T> exten
         if (propertyName == null) {
             throw new ComponentInitializationException("Property name cannot be null or empty");
         } else if (propertyAliases == null) {
-            propertyAliases = Collections.emptyList();
+            propertyAliases = CollectionSupport.emptyList();
         }
         
         if (legacyPropertyName != null) {
             final Collection<String> aliases = List.copyOf(propertyAliases);
             legacyPropertyAliases = aliases.stream()
                     .map(s -> s + (s.endsWith("/") ? legacyPropertyName : '/' + legacyPropertyName))
-                    .collect(Collectors.toUnmodifiableList());
+                    .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).get();
         }
         
         // Now attach the property name to the end of the alias list entries.
         propertyAliases = propertyAliases.stream()
                 .map(s -> s + (s.endsWith("/") ? propertyName : '/' + propertyName))
-                .collect(Collectors.toUnmodifiableList());
+                .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).get();
         
     }
 
diff --git a/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeContextTest.java b/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeContextTest.java
index 743ccd855..71d06f027 100644
--- a/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeContextTest.java
+++ b/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeContextTest.java
@@ -18,9 +18,9 @@
 package net.shibboleth.idp.attribute;
 
 import java.util.Arrays;
-import java.util.Collections;
 
 import net.shibboleth.idp.attribute.context.AttributeContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -41,7 +41,7 @@ public class AttributeContextTest {
         try {
             context.getIdPAttributes().put("attr", new IdPAttribute("attr") );
             Assert.fail();
-        } catch (UnsupportedOperationException e) {
+        } catch (final UnsupportedOperationException e) {
 
         }
     }
@@ -53,7 +53,7 @@ public class AttributeContextTest {
         context.setIdPAttributes(Arrays.asList(new IdPAttribute("foo"), new IdPAttribute("bar")));
         contextAttributes(context, 2);
         
-        context.setIdPAttributes(Collections.emptySet());
+        context.setIdPAttributes(CollectionSupport.emptySet());
         contextAttributes(context, 0);
     }
 
diff --git a/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeTest.java b/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeTest.java
index 94395d664..0c2e891c6 100644
--- a/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeTest.java
+++ b/shib-attribute-api/src/test/java/net/shibboleth/idp/attribute/AttributeTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -34,6 +33,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.EmptyAttributeValue.EmptyType;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 /** Unit test for {@link IdPAttribute} class. */
@@ -91,7 +91,7 @@ public class AttributeTest extends OpenSAMLInitBaseTestCase{
         attrib.setValues(null);
         Assert.assertTrue(attrib.getValues().isEmpty());
 
-        attrib.setValues(Collections.emptyList());
+        attrib.setValues(CollectionSupport.emptyList());
         Assert.assertTrue(attrib.getValues().isEmpty());
         
         List<IdPAttributeValue> attribValues = new ArrayList<>();
@@ -116,7 +116,7 @@ public class AttributeTest extends OpenSAMLInitBaseTestCase{
         try {
             Assert.assertFalse(attrib.getValues().add(null));
             Assert.fail();
-        } catch (NullPointerException e) {
+        } catch (final NullPointerException e) {
             // THis is OK by the annotation
         }
 
@@ -189,7 +189,7 @@ public class AttributeTest extends OpenSAMLInitBaseTestCase{
         Assert.assertTrue(attrib.compareTo(diff) > 0);
         Assert.assertEquals(attrib.compareTo(dupl) , 0);
         
-        attrib.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attrib.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         attrib.toString();
     }
     
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
index a46b4cf55..a336bd7bb 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/Matcher.java
@@ -27,6 +27,7 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 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 net.shibboleth.shared.component.IdentifiedComponent;
@@ -36,45 +37,51 @@ import net.shibboleth.shared.component.IdentifiedComponent;
 public interface Matcher extends IdentifiedComponent {
 
     /** A {@link Matcher} that returns true/all attribute values as matched. */
-    @Nonnull public static final Matcher MATCHES_ALL = new Matcher() {
+    @Nonnull static final Matcher MATCHES_ALL = new Matcher() {
 
         /** {@inheritDoc} */
-        @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+        @Nullable @NonnullElements @Unmodifiable @NotLive
+        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
                 @Nonnull final AttributeFilterContext filterContext) {
-            return Set.copyOf(attribute.getValues());
+            return CollectionSupport.copyToSet(attribute.getValues());
         }
 
-        @Override @Nullable public String getId() {
+        /** {@inheritDoc} */
+        @Nullable public String getId() {
             return "MATCHES_ALL";
         }
 
     };
 
     /** A {@link Matcher} that returns false/no attribute values as matched. */
-    @Nonnull public static final Matcher MATCHES_NONE = new Matcher() {
+    @Nonnull static final Matcher MATCHES_NONE = new Matcher() {
 
         /** {@inheritDoc} */
-        @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+        @Nullable @NonnullElements @Unmodifiable @NotLive
+        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
                 @Nonnull final AttributeFilterContext filterContext) {
             return CollectionSupport.emptySet();
         }
 
-        @Override @Nullable public String getId() {
+        /** {@inheritDoc} */
+        @Nullable public String getId() {
             return "MATCHES_NONE";
         }
 
     };
 
     /** A {@link Matcher} that fails. targetted primarily at testing, but also at odd corners of parsing. */
-    @Nonnull public static final Matcher MATCHER_FAILS = new Matcher() {
+    @Nonnull static final Matcher MATCHER_FAILS = new Matcher() {
 
         /** {@inheritDoc} */
-        @Override public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+        @Nullable @NonnullElements @Unmodifiable @NotLive
+        public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
                 @Nonnull final AttributeFilterContext filterContext) {
             return null;
         }
 
-        @Override @Nullable public String getId() {
+        /** {@inheritDoc} */
+        @Nullable public String getId() {
             return "MATCHER_FAILS";
         }
 
@@ -87,7 +94,7 @@ public interface Matcher extends IdentifiedComponent {
      * @param filterContext the filter context
      * @return The result of this rule. Null if we failed.
      */
-    @Nullable @NonnullElements @Unmodifiable public Set<IdPAttributeValue> getMatchingValues(
+    @Nullable @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext);
 
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
index 2b6864e95..341b40be0 100644
--- a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContext.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.filter.context;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -35,7 +34,9 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.AttributeFilterException;
 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;
 
@@ -51,10 +52,10 @@ import net.shibboleth.shared.primitive.StringSupport;
 public final class AttributeFilterWorkContext extends BaseContext {
 
     /** Values, for a given attribute, that are permitted to be released. */
-    private final Map<String, Set<IdPAttributeValue>> permittedValues;
+    @Nonnull private final Map<String, Set<IdPAttributeValue>> permittedValues;
 
     /** Values, for a given attribute, that are not permitted to be released. */
-    private final Map<String, Set<IdPAttributeValue>> deniedValues;
+    @Nonnull private final Map<String, Set<IdPAttributeValue>> deniedValues;
 
     /** Constructor. */
     public AttributeFilterWorkContext() {
@@ -67,9 +68,9 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @return collection of attribute values, indexed by ID, that are permitted to be released,
      */
-    @Nonnull @NonnullElements @Unmodifiable public
-            Map<String, Set<IdPAttributeValue>> getPermittedIdPAttributeValues() {
-        return Collections.unmodifiableMap(permittedValues);
+    @Nonnull @NonnullElements @Unmodifiable @NotLive
+    public Map<String, Set<IdPAttributeValue>> getPermittedIdPAttributeValues() {
+        return CollectionSupport.copyToMap(permittedValues);
     }
 
     /**
@@ -128,8 +129,9 @@ public final class AttributeFilterWorkContext extends BaseContext {
      * 
      * @return collection of attribute values, indexed by ID, that are not permitted to be released
      */
-    @Nonnull @NonnullElements @Unmodifiable public Map<String, Set<IdPAttributeValue>> getDeniedAttributeValues() {
-        return Collections.unmodifiableMap(deniedValues);
+    @Nonnull @NonnullElements @Unmodifiable @NotLive
+    public Map<String, Set<IdPAttributeValue>> getDeniedAttributeValues() {
+        return CollectionSupport.copyToMap(deniedValues);
     }
 
     /**
diff --git a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
index 5efdae6bb..0c532782b 100644
--- a/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
+++ b/shib-attribute-filter-api/src/test/java/net/shibboleth/idp/attribute/filter/context/AttributeFilterWorkContextTest.java
@@ -19,12 +19,12 @@ package net.shibboleth.idp.attribute.filter.context;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.AttributeFilterException;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 import org.testng.Assert;
@@ -54,7 +54,7 @@ public class AttributeFilterWorkContextTest {
         attribute1.setValues(Arrays.asList(aStringAttributeValue, bStringAttributeValue));
         parent.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        context.addPermittedIdPAttributeValues("one", Collections.singletonList(aStringAttributeValue));
+        context.addPermittedIdPAttributeValues("one", CollectionSupport.singletonList(aStringAttributeValue));
         Assert.assertEquals(context.getPermittedIdPAttributeValues().get("one").size(), 1);
 
         context.addPermittedIdPAttributeValues("one", null);
@@ -63,25 +63,25 @@ public class AttributeFilterWorkContextTest {
         context.addPermittedIdPAttributeValues("one", new ArrayList<IdPAttributeValue>());
         Assert.assertEquals(context.getPermittedIdPAttributeValues().get("one").size(), 1);
 
-        context.addPermittedIdPAttributeValues("one", Collections.singletonList(bStringAttributeValue));
+        context.addPermittedIdPAttributeValues("one", CollectionSupport.singletonList(bStringAttributeValue));
         Assert.assertEquals(context.getPermittedIdPAttributeValues().get("one").size(), 2);
 
         try {
-            context.addPermittedIdPAttributeValues("", Collections.singletonList(aStringAttributeValue));
+            context.addPermittedIdPAttributeValues("", CollectionSupport.singletonList(aStringAttributeValue));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
-            context.addPermittedIdPAttributeValues("two", Collections.singletonList(aStringAttributeValue));
+            context.addPermittedIdPAttributeValues("two", CollectionSupport.singletonList(aStringAttributeValue));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
-            context.addPermittedIdPAttributeValues("one", Collections.singletonList(cStringAttributeValue));
+            context.addPermittedIdPAttributeValues("one", CollectionSupport.singletonList(cStringAttributeValue));
             Assert.fail();
         } catch (final AttributeFilterException e) {
             // expected this
@@ -101,7 +101,7 @@ public class AttributeFilterWorkContextTest {
         attribute1.setValues(Arrays.asList(aStringAttributeValue, bStringAttributeValue));
         parent.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        context.addDeniedIdPAttributeValues("one", Collections.singletonList(aStringAttributeValue));
+        context.addDeniedIdPAttributeValues("one", CollectionSupport.singletonList(aStringAttributeValue));
         Assert.assertEquals(context.getDeniedAttributeValues().get("one").size(), 1);
 
         context.addDeniedIdPAttributeValues("one", null);
@@ -110,25 +110,25 @@ public class AttributeFilterWorkContextTest {
         context.addDeniedIdPAttributeValues("one", new ArrayList<IdPAttributeValue>());
         Assert.assertEquals(context.getDeniedAttributeValues().get("one").size(), 1);
 
-        context.addDeniedIdPAttributeValues("one", Collections.singletonList(bStringAttributeValue));
+        context.addDeniedIdPAttributeValues("one", CollectionSupport.singletonList(bStringAttributeValue));
         Assert.assertEquals(context.getDeniedAttributeValues().get("one").size(), 2);
 
         try {
-            context.addDeniedIdPAttributeValues("", Collections.singletonList(bStringAttributeValue));
+            context.addDeniedIdPAttributeValues("", CollectionSupport.singletonList(bStringAttributeValue));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
-            context.addDeniedIdPAttributeValues("two", Collections.singletonList(bStringAttributeValue));
+            context.addDeniedIdPAttributeValues("two", CollectionSupport.singletonList(bStringAttributeValue));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected this
         }
 
         try {
-            context.addDeniedIdPAttributeValues("one", Collections.singletonList(cStringAttributeValue));
+            context.addDeniedIdPAttributeValues("one", CollectionSupport.singletonList(cStringAttributeValue));
             Assert.fail();
         } catch (final AttributeFilterException e) {
             // expected this
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
index 829f4da55..a8d34e714 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/AbstractMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -32,7 +31,9 @@ import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 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.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -58,7 +59,7 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
     /**
      * {@inheritDoc}
      */
-    @Override @Nonnull @NonnullElements @Unmodifiable public Set<IdPAttributeValue> getMatchingValues(
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
 
         final Set<IdPAttributeValue> matchedValues = new LinkedHashSet<>();
@@ -66,12 +67,13 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
         log.debug("{} Applying value comparison to all values of Attribute '{}'", getLogPrefix(), attribute.getId());
 
         for (final IdPAttributeValue value : attribute.getValues()) {
+            assert value != null;
             if (compareAttributeValue(value)) {
                 matchedValues.add(value);
             }
         }
 
-        return Collections.unmodifiableSet(matchedValues);
+        return CollectionSupport.copyToSet(matchedValues);
     }
 
     /**
@@ -80,7 +82,7 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
      * @param value the value to look at
      * @return yes if we do, otherwise no.
      */
-    protected abstract boolean compareAttributeValue(IdPAttributeValue value);
+    protected abstract boolean compareAttributeValue(@Nonnull final IdPAttributeValue value);
 
     /**
      * Return a string which is to be prepended to all log messages.
@@ -97,6 +99,7 @@ public abstract class AbstractMatcher extends AbstractIdentifiableInitializableC
                 logPrefix = prefix;
             }
         }
+        assert prefix != null;
         return prefix;
     }
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index 69ae01dc7..073432e9a 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
@@ -18,9 +18,7 @@
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 
@@ -41,6 +39,7 @@ import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 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 net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -146,6 +145,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
             throw new ComponentInitializationException("No script has been provided");
         }
         
+        assert script != null;
         scriptEvaluator = new MatcherScriptEvaluator(script);
         scriptEvaluator.setCustomObject(customObject);
         scriptEvaluator.setContextExtenders(contextExtenders);
@@ -237,7 +237,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
          * 
          * @return script result
          */
-        @Nullable @NonnullElements @Unmodifiable public Set<IdPAttributeValue> execute(
+        @Nullable @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> execute(
                 @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
             final Object result = evaluate(attribute, filterContext);
             if (null == result) {
@@ -247,7 +247,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
 
             final Set<IdPAttributeValue> returnValues = new LinkedHashSet<>(attribute.getValues());
             returnValues.retainAll((Set<?>) result);
-            return Collections.unmodifiableSet(returnValues);
+            return CollectionSupport.copyToSet(returnValues);
         }
 
         /** {@inheritDoc} */
@@ -269,4 +269,4 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
         }
     }
     
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
index f01e40b53..3e7d6de65 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcher.java
@@ -25,6 +25,7 @@ import javax.annotation.Nullable;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 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 net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
@@ -49,7 +50,7 @@ public abstract class AbstractComposedMatcher extends AbstractIdentifiableInitia
         checkSetterPreconditions();
 
         if (composedMatchers != null) {
-            matchers = List.copyOf(composedMatchers);
+            matchers = CollectionSupport.copyToList(composedMatchers);
         } else {
             matchers = CollectionSupport.emptyList();
         }
@@ -68,7 +69,7 @@ public abstract class AbstractComposedMatcher extends AbstractIdentifiableInitia
      * 
      * @return the composed matchers
      */
-    @Nonnull @NonnullElements @Unmodifiable public List<Matcher> getComposedMatchers() {
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public List<Matcher> getComposedMatchers() {
         assert matchers != null;
         return matchers;
     }
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
index dcb607b5d..582880153 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AndMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -34,6 +33,8 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
@@ -51,7 +52,7 @@ public class AndMatcher extends AbstractComposedMatcher {
      * If any of the matchers fail then failure is returned
      * {@link Matcher}. {@inheritDoc}
      */
-    @Override @Nullable @NonnullElements 
+    @Override @Nullable @NonnullElements @NotLive
     public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
             @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
@@ -77,11 +78,11 @@ public class AndMatcher extends AbstractComposedMatcher {
             }
             matchingValues.retainAll(match);
             if (matchingValues.isEmpty()) {
-                return Collections.emptySet();
+                return CollectionSupport.emptySet();
             }
         }
 
-        return Collections.unmodifiableSet(matchingValues);
+        return CollectionSupport.copyToSet(matchingValues);
     }
     
     /** {@inheritDoc} */
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
index 88ff02287..cc1e3c59a 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/NotMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -33,6 +32,8 @@ import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
@@ -75,7 +76,7 @@ public final class NotMatcher extends AbstractIdentifiableInitializableComponent
      * A given attribute value is considered to have matched if it is not returned by the composed {@link Matcher}.
      * {@inheritDoc}
      */
-    @Override @Nullable @NonnullElements public Set<IdPAttributeValue> getMatchingValues(
+    @Override @Nullable @NonnullElements @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
         Constraint.isNotNull(filterContext, "Attribute filter context can not be null");
@@ -95,9 +96,9 @@ public final class NotMatcher extends AbstractIdentifiableInitializableComponent
         attributeValues.removeAll(matches);
 
         if (attributeValues.isEmpty()) {
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
-        return Collections.unmodifiableSet(attributeValues);
+        return CollectionSupport.copyToSet(attributeValues);
     }
     
     /** {@inheritDoc} */
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
index b4364235c..67f9aaf43 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -31,6 +30,8 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 
@@ -43,7 +44,7 @@ import net.shibboleth.shared.logic.Constraint;
 public class OrMatcher extends AbstractComposedMatcher {
 
     /** {@inheritDoc} */
-    @Override @Nullable @NonnullElements
+    @Override @Nullable @NonnullElements @NotLive
     public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
             @Nonnull final AttributeFilterContext filterContext) {
         Constraint.isNotNull(attribute, "Attribute to be filtered can not be null");
@@ -63,7 +64,7 @@ public class OrMatcher extends AbstractComposedMatcher {
             matchingValues.addAll(matches);
         }
 
-        return Collections.unmodifiableSet(matchingValues);
+        return CollectionSupport.copyToSet(matchingValues);
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
index 486a7ff9b..f124f37cb 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AbstractMatchesShibMDScopeMatcher.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -37,6 +36,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.saml.metadata.ScopesContainer;
 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.component.AbstractIdentifiableInitializableComponent;
@@ -51,10 +51,10 @@ public abstract class AbstractMatchesShibMDScopeMatcher
                 extends AbstractIdentifiableInitializableComponent implements Matcher {
 
     /** Class logger. */
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractMatchesShibMDScopeMatcher.class);
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(AbstractMatchesShibMDScopeMatcher.class);
 
     /** The String used to prefix log message. */
-    private String logPrefix;
+    @Nullable private String logPrefix;
 
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
@@ -66,8 +66,8 @@ public abstract class AbstractMatchesShibMDScopeMatcher
     /**
      * {@inheritDoc}
      */
-    // CheckStyle: CyclomaticComplexity OFF
-    @Override @Nonnull @NonnullElements @Unmodifiable public Set<IdPAttributeValue> getMatchingValues(
+// CheckStyle: CyclomaticComplexity OFF
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<IdPAttributeValue> getMatchingValues(
             @Nonnull final IdPAttribute attribute, @Nonnull final AttributeFilterContext filterContext) {
 
         final SAMLMetadataContext issuerContext = filterContext.getIssuerMetadataContext();
@@ -120,7 +120,7 @@ public abstract class AbstractMatchesShibMDScopeMatcher
             }
         }
         LOG.debug("{} returning {} values", getLogPrefix(), matchedValues.size());
-        return Collections.unmodifiableSet(matchedValues);
+        return CollectionSupport.copyToSet(matchedValues);
     }
     // CheckStyle: CyclomaticComplexity ON
 
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
index 8a05810d6..cecf20ec5 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRule.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.logic.impl;
 
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -28,7 +27,9 @@ import com.google.common.base.MoreObjects;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 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 net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -41,7 +42,7 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
         PolicyRequirementRule, UnmodifiableComponent {
 
     /** The composed matchers. */
-    private @NonnullAfterInit List<PolicyRequirementRule> rules;
+    @NonnullAfterInit private List<PolicyRequirementRule> rules;
 
     /** Set the rules to be composed.
      * Called "subsidiaries" to allow easier parsing.
@@ -51,9 +52,9 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
         checkSetterPreconditions();
         
         if (theRules != null) {
-            rules = List.copyOf(theRules);
+            rules = CollectionSupport.copyToList(theRules);
         } else {
-            rules = Collections.emptyList();
+            rules = CollectionSupport.emptyList();
         }
     }
     
@@ -70,7 +71,7 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
      * 
      * @return the composed matchers
      */
-    @Nonnull @NonnullElements @Unmodifiable public List<PolicyRequirementRule> getComposedRules() {
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public List<PolicyRequirementRule> getComposedRules() {
         return rules;
     }
 
@@ -78,4 +79,5 @@ public abstract class AbstractComposedPolicyRule extends AbstractIdentifiableIni
     @Override public String toString() {
         return MoreObjects.toStringHelper(this).add("Composed Rules : ", getComposedRules()).toString();
     }
+
 }
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
index 851591da7..d37a65f23 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/AbstractEntityGroupPolicyRule.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
-import java.util.Collections;
 import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
@@ -31,6 +30,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.policyrule.impl.AbstractPolicyRule;
 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.primitive.StringSupport;
@@ -135,7 +135,7 @@ public abstract class AbstractEntityGroupPolicyRule extends AbstractPolicyRule {
         }
 
         final Predicate<EntityDescriptor> predicate =
-                new EntityGroupNamePredicate(Collections.singleton(entityGroup),
+                new EntityGroupNamePredicate(CollectionSupport.singleton(entityGroup),
                         checkAffiliations ? input.getMetadataResolver() : null);
         
         return predicate.test(entity) ? Tristate.TRUE : Tristate.FALSE;
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
index 40b84441f..1c7cf01a6 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/TargettedAttributeValueFilterTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.filter.complex.impl;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -41,6 +40,7 @@ import net.shibboleth.idp.attribute.filter.matcher.impl.AttributeValueStringMatc
 import net.shibboleth.idp.attribute.filter.matcher.logic.impl.NotMatcher;
 import net.shibboleth.idp.attribute.filter.matcher.logic.impl.NotMatcherTest;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -95,9 +95,9 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singleton(attributeValueFilterPolicy));
+                        CollectionSupport.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
+        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", CollectionSupport.singleton(policy));
 
         attributeValueFilterPolicy.initialize();
         policy.initialize();
@@ -162,9 +162,9 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singleton(attributeValueFilterPolicy));
+                        CollectionSupport.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
+        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", CollectionSupport.singleton(policy));
     
         attributeValueFilterPolicy.initialize();
         policy.initialize();
@@ -220,9 +220,9 @@ public class TargettedAttributeValueFilterTest extends BaseComplexAttributeFilte
         final PolicyFromMatcherId rule = new PolicyFromMatcherId(valueMatcher(), "uid");
         rule.setId("rule");
         final AttributeFilterPolicy policy =
-                new AttributeFilterPolicy("targettedAtPermit", rule,  Collections.singleton(attributeValueFilterPolicy));
+                new AttributeFilterPolicy("targettedAtPermit", rule,  CollectionSupport.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
+        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", CollectionSupport.singleton(policy));
 
         attributeValueFilterPolicy.initialize();
         policy.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
index 8f14e9859..f2782cfc0 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/complex/impl/UntargettedAttributeValueFilterTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.filter.complex.impl;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -38,6 +37,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.impl.AttributeFilterImpl;
 import net.shibboleth.idp.attribute.filter.matcher.impl.AttributeValueStringMatcher;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -89,9 +89,9 @@ public class UntargettedAttributeValueFilterTest extends BaseComplexAttributeFil
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("targettedAtPermit", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singleton(attributeValueFilterPolicy));
+                        CollectionSupport.singleton(attributeValueFilterPolicy));
         
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
+        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", CollectionSupport.singleton(policy));
         attributeValueFilterPolicy.initialize();
         policy.initialize();
         engine.initialize();
@@ -145,9 +145,9 @@ public class UntargettedAttributeValueFilterTest extends BaseComplexAttributeFil
         PolicyFromMatcher rule = new PolicyFromMatcher(valueMatcher());
         rule.setId("rule");
         final AttributeFilterPolicy policy =
-                new AttributeFilterPolicy("targettedAtPermit", rule,  Collections.singleton(attributeValueFilterPolicy));
+                new AttributeFilterPolicy("targettedAtPermit", rule,  CollectionSupport.singleton(attributeValueFilterPolicy));
 
-        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", Collections.singleton(policy));
+        final AttributeFilterImpl engine = new AttributeFilterImpl("engine", CollectionSupport.singleton(policy));
 
             attributeValueFilterPolicy.initialize();
             policy.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
index 215cac3f4..44670ff5f 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/impl/AttributeFilterImplTest.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.impl;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -36,6 +34,7 @@ import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.testing.MockMatcher;
 import net.shibboleth.idp.attribute.filter.testing.MockPolicyRequirementRule;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
@@ -49,21 +48,21 @@ public class AttributeFilterImplTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testPostConstructionState() throws Exception {
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.emptyList());
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.emptyList());
             
         Assert.assertNotNull(filter.getFilterPolicies());
         Assert.assertTrue(filter.getFilterPolicies().isEmpty());
         Assert.assertEquals(filter.getId(), "engine");
 
         try {
-            final AttributeFilterImpl engine = new AttributeFilterImpl("  ", null);
+            new AttributeFilterImpl("  ", null);
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected
         }
 
         try {
-            final AttributeFilterImpl engine = new AttributeFilterImpl("", null);
+            new AttributeFilterImpl("", null);
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected
@@ -80,7 +79,7 @@ public class AttributeFilterImplTest {
         AttributeFilterPolicy policy2 = new AttributeFilterPolicy("policy2", PolicyRequirementRule.MATCHES_NONE, null);
         AttributeFilterPolicy policy3 = new AttributeFilterPolicy("policy3", PolicyRequirementRule.MATCHES_NONE, null);
 
-        AttributeFilterImpl filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy1, policy2));
+        AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.listOf(policy1, policy1, policy2));
 
         policy1.initialize();
         policy2.initialize();
@@ -95,7 +94,7 @@ public class AttributeFilterImplTest {
         Assert.assertFalse(filter.getFilterPolicies().contains(policy3));
         Assert.assertFalse(policy3.isInitialized());
 
-        filter = new AttributeFilterImpl("engine", Arrays.asList(policy1, policy2));
+        filter = new AttributeFilterImpl("engine", CollectionSupport.listOf(policy1, policy2));
         filter.initialize();
 
         Assert.assertEquals(filter.getFilterPolicies().size(), 2);
@@ -129,19 +128,19 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singletonList(attribute1Policy));
+                        CollectionSupport.singletonList(attribute1Policy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
         final IdPAttribute attribute2 = new IdPAttribute("attribute2");
-        attribute2.setValues(Arrays.asList(new StringAttributeValue("a"), new StringAttributeValue("b")));
+        attribute2.setValues(CollectionSupport.listOf(new StringAttributeValue("a"), new StringAttributeValue("b")));
         filterContext.getPrefilteredIdPAttributes().put(attribute2.getId(), attribute2);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         attribute1Policy.initialize();
         policy.initialize();
@@ -166,18 +165,18 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singletonList(attribute1Policy));
+                        CollectionSupport.singletonList(attribute1Policy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
         attribute1Policy.initialize();
         policy.initialize();
         
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
         filter.initialize();
         filter.filterAttributes(filterContext);
         final List<IdPAttributeValue> result = filterContext.getFilteredIdPAttributes().get("attribute1").getValues();
@@ -198,18 +197,18 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singletonList(attribute2Policy));
+                        CollectionSupport.singletonList(attribute2Policy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
         attribute2Policy.initialize();
         policy.initialize();
         
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
         filter.initialize();
 
         filter.filterAttributes(filterContext);
@@ -227,15 +226,15 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Collections.singletonList(attribute1Policy));
+                        CollectionSupport.singletonList(attribute1Policy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         attribute1Policy.initialize();
         policy.initialize();
@@ -248,7 +247,7 @@ public class AttributeFilterImplTest {
     @Test public void testDenyFilterAttributes() throws Exception {
         final MockMatcher deny = new MockMatcher();
         deny.setMatchingAttribute("attribute1");
-        deny.setMatchingValues(Collections.singletonList(new StringAttributeValue("one")));
+        deny.setMatchingValues(CollectionSupport.singletonList(new StringAttributeValue("one")));
 
         final AttributeRule denyPolicy = new AttributeRule();
         denyPolicy.setId("denyPolicy");
@@ -264,15 +263,15 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Arrays.asList(denyPolicy, allowPolicy));
+                        CollectionSupport.listOf(denyPolicy, allowPolicy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         denyPolicy.initialize();
         allowPolicy.initialize();
@@ -296,15 +295,15 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_NONE,
-                        Collections.singletonList(allowPolicy));
+                        CollectionSupport.singletonList(allowPolicy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         policy.initialize();
         filter.initialize();
@@ -328,15 +327,15 @@ public class AttributeFilterImplTest {
 
         final AttributeFilterPolicy policy =
                 new AttributeFilterPolicy("attribute1Policy", PolicyRequirementRule.MATCHES_ALL,
-                        Arrays.asList(denyPolicy, allowPolicy));
+                        CollectionSupport.listOf(denyPolicy, allowPolicy));
 
         final AttributeFilterContext filterContext = new AttributeFilterContext();
 
         final IdPAttribute attribute1 = new IdPAttribute("attribute1");
-        attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
+        attribute1.setValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("two")));
         filterContext.getPrefilteredIdPAttributes().put(attribute1.getId(), attribute1);
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         allowPolicy.initialize();
         denyPolicy.initialize();
@@ -357,14 +356,14 @@ public class AttributeFilterImplTest {
         filterPolicy.setIsDenyRule(false);
 
         final MockPolicyRequirementRule policyRule = new MockPolicyRequirementRule();
-        final AttributeFilterPolicy policy = new AttributeFilterPolicy("policy", policyRule, Collections.singletonList(filterPolicy));
+        final AttributeFilterPolicy policy = new AttributeFilterPolicy("policy", policyRule, CollectionSupport.singletonList(filterPolicy));
 
         Assert.assertFalse(policyRule.isInitialized());
         Assert.assertFalse(policyRule.isDestroyed());
         Assert.assertFalse(matcher.isInitialized());
         Assert.assertFalse(matcher.isDestroyed());
 
-        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", Collections.singletonList(policy));
+        final AttributeFilterImpl filter = new AttributeFilterImpl("engine", CollectionSupport.singletonList(policy));
 
         policy.initialize();
         matcher.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
index 1a9ba5f6e..1c735e361 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcherTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.filter.matcher.impl;
 
 import static org.testng.Assert.*;
 
-import java.util.Collections;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -29,6 +28,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
 import net.shibboleth.shared.component.UninitializedComponentException;
@@ -124,7 +124,7 @@ public class ScriptedMatcherTest extends AbstractMatcherPolicyRuleTest {
         script.initialize();
         final ScriptedMatcher matcher = newScriptedMatcher(script);
         
-        final Set<IdPAttributeValue> custom = Collections.singleton(attribute.getValues().get(0));
+        final Set<IdPAttributeValue> custom = CollectionSupport.singleton(attribute.getValues().get(0));
         matcher.setId("Test");
         matcher.setCustomObject(custom);
         matcher.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcherTest.java
index 98339f031..2a8b9c30d 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/AbstractComposedMatcherTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -34,6 +33,7 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
@@ -46,7 +46,7 @@ public class AbstractComposedMatcherTest {
 
     @Test public void testInitDestroy() throws ComponentInitializationException {
         final List<Matcher> firstList = new ArrayList<>(2);
-        ComposedMatcher matcher = new ComposedMatcher(Collections.emptyList());
+        ComposedMatcher matcher = new ComposedMatcher(CollectionSupport.emptyList());
 
         for (int i = 0; i < 2; i++) {
             firstList.add(new TestMatcher());
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
index 04dfb5726..47e7f7dc5 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/logic/impl/OrMatcherTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.filter.matcher.logic.impl;
 import static com.google.common.base.Predicates.equalTo;
 import static org.testng.Assert.*;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -51,7 +50,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
     
     @Test public void testSingleton() throws Exception {
         final OrMatcher matcher =
-                newOrMatcher(Collections.singletonList((Matcher) new MockValuePredicateMatcher(PredicateSupport.or(equalTo(value1),
+                newOrMatcher(CollectionSupport.singletonList((Matcher) new MockValuePredicateMatcher(PredicateSupport.or(equalTo(value1),
                         equalTo(value2)))));
 
         matcher.setId("test");
@@ -95,7 +94,7 @@ public class OrMatcherTest extends AbstractMatcherPolicyRuleTest {
             // expect this
         }
 
-        matcher = newOrMatcher(Collections.emptyList());
+        matcher = newOrMatcher(CollectionSupport.emptyList());
         matcher.setId("test");
         try {
             matcher.initialize();
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
index 68361f3d5..ebb344dd9 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/AttributeInMetadataMatcherTest.java
@@ -19,9 +19,7 @@ package net.shibboleth.idp.attribute.filter.matcher.saml.impl;
 
 import static org.testng.Assert.*;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -52,6 +50,7 @@ import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.matcher.impl.DataSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -111,7 +110,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Nonnull private AttributeFilterContext makeContext(@Nullable RequestedAttribute attribute) {
         final AttributeFilterContext context = new AttributeFilterContext();
         if (attribute != null) {
-            setRequestedAttributesInContext(context, Collections.singletonList(attribute));
+            setRequestedAttributesInContext(context, CollectionSupport.singletonList(attribute));
         }
         return context;
     }
@@ -139,7 +138,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void noRequested() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         Set<IdPAttributeValue> result =
                 makeMatcher("test", true, true, null, null).getMatchingValues(attr, new AttributeFilterContext());
@@ -155,7 +154,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void wrongRequested() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeInMetadataMatcher matcher = makeMatcher("test", true, false, "wrongAttr", Attribute.URI_REFERENCE);
         Set<IdPAttributeValue> result = matcher.getMatchingValues(attr, makeContext(null));
@@ -174,7 +173,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void otherRequested() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeInMetadataMatcher matcher = makeMatcher("test", false, false, "attr2", Attribute.BASIC);
 
@@ -192,7 +191,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void isRequiredOnly() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final RequestedAttribute req = reqAttributeBuilder.buildObject();
         req.setName("attr");
@@ -213,7 +212,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void values() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final RequestedAttribute req = reqAttributeBuilder.buildObject();
         req.setName("attr");
@@ -234,10 +233,10 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void noName() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeFilterContext context = makeContext(null);
-        setRequestedAttributesInContext(context, Collections.emptySet());
+        setRequestedAttributesInContext(context, CollectionSupport.emptySet());
         
         final BaseContext b1 = context.getRequesterMetadataContext();
         assert b1 != null;
@@ -261,7 +260,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
     @Test public void multiValues() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final RequestedAttribute req = reqAttributeBuilder.buildObject();
         req.setName("attr");
@@ -278,7 +277,7 @@ public class AttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCase {
 
         final AttributeFilterContext context = new AttributeFilterContext();
 
-        setRequestedAttributesInContext(context, Collections.singletonList(req));
+        setRequestedAttributesInContext(context, CollectionSupport.singletonList(req));
 
         final Set<IdPAttributeValue> result =
                 makeMatcher("test", false, true, "attr", Attribute.BASIC).getMatchingValues(attr, context);
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
index b8cce49c2..122158d90 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/matcher/saml/impl/MappedAttributeInMetadataMatcherTest.java
@@ -21,8 +21,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -48,6 +46,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.matcher.impl.DataSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -131,7 +130,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void noRequested() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         Set<IdPAttributeValue> result =
                 makeMatcher("test", true, true).getMatchingValues(attr, new AttributeFilterContext());
@@ -147,7 +146,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void wrongRequested() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeInMetadataMatcher matcher = makeMatcher("test", true, true);
         Set<IdPAttributeValue> result = matcher.getMatchingValues(attr, makeContext(null));
@@ -163,7 +162,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void isRequiredOnly() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         IdPRequestedAttribute required = new IdPRequestedAttribute("attr");
         required.setRequired(false);
@@ -183,11 +182,11 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void values() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         IdPRequestedAttribute required = new IdPRequestedAttribute("attr");
         required.setRequired(true);
-        required.setValues(Collections.singletonList(DataSources.STRING_VALUE));
+        required.setValues(CollectionSupport.singletonList(DataSources.STRING_VALUE));
 
         AttributeFilterContext context = makeContext(required);
 
@@ -199,7 +198,7 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void valuesButNoConvert() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeFilterContext context = makeContext("attr", null);
         final Set<IdPAttributeValue> result = makeMatcher("test", false, true).getMatchingValues(attr, context);
@@ -209,15 +208,15 @@ public class MappedAttributeInMetadataMatcherTest extends OpenSAMLInitBaseTestCa
     @Test public void multiValues() throws ComponentInitializationException {
 
         final IdPAttribute attr =
-                makeAttribute("attr", Arrays.asList(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
+                makeAttribute("attr", CollectionSupport.listOf(DataSources.STRING_VALUE, DataSources.NON_MATCH_STRING_VALUE));
 
         final IdPRequestedAttribute req1 = new IdPRequestedAttribute("attr");
         req1.setRequired(true);
-        req1.setValues(Collections.singletonList(DataSources.STRING_VALUE));
+        req1.setValues(CollectionSupport.singletonList(DataSources.STRING_VALUE));
 
         final IdPRequestedAttribute req2 = new IdPRequestedAttribute("attr");
         req2.setRequired(true);
-        req2.setValues(Collections.singletonList(DataSources.NON_MATCH_STRING_VALUE));
+        req2.setValues(CollectionSupport.singletonList(DataSources.NON_MATCH_STRING_VALUE));
 
         final AttributeFilterContext context = new AttributeFilterContext();
 
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRuleTest.java
index 1c3800686..f8e76c948 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/filtercontext/impl/NumOfAttributeValuesPolicyRuleTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 
 import java.util.ArrayList;
-import java.util.Collections;
 
 import org.testng.annotations.Test;
 
@@ -30,6 +29,7 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
@@ -118,7 +118,7 @@ public class NumOfAttributeValuesPolicyRuleTest {
         }
         attr.setValues(hs);
         final AttributeFilterContext context = new AttributeFilterContext();
-        context.setPrefilteredIdPAttributes(Collections.singleton(attr));
+        context.setPrefilteredIdPAttributes(CollectionSupport.singleton(attr));
         return context;
     }
     
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRuleTest.java
index 5c7e1dabe..5a851400d 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AbstractComposedPolicyRuleTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -30,6 +29,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
@@ -44,7 +44,7 @@ public class AbstractComposedPolicyRuleTest {
     @Test
     public void testInitDestroy() throws ComponentInitializationException {
         final List<PolicyRequirementRule> firstList = new ArrayList<>(2);
-        ComposedPolicyRule rule = new ComposedPolicyRule(Collections.emptyList());
+        ComposedPolicyRule rule = new ComposedPolicyRule(CollectionSupport.emptyList());
         
         for (int i = 0; i < 2;i++) {
             firstList.add(new TestMatcher());
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRuleTest.java
index bbc0abd75..1e107d374 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/AndPolicyRuleTest.java
@@ -19,8 +19,7 @@ package net.shibboleth.idp.attribute.filter.policyrule.logic.impl;
 
 import static org.testng.Assert.*;
 
-import java.util.Arrays;
-import java.util.Collections;
+
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -32,6 +31,7 @@ import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
 import net.shibboleth.idp.attribute.filter.matcher.impl.AbstractMatcherPolicyRuleTest;
 import net.shibboleth.idp.attribute.filter.matcher.impl.DataSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link AndPolicyRule} unit test. */
@@ -44,45 +44,45 @@ public class AndPolicyRuleTest extends AbstractMatcherPolicyRuleTest {
 
     @Test(expectedExceptions = {ComponentInitializationException.class}) public void emptyInput()
             throws ComponentInitializationException {
-        final AndPolicyRule rule = newAndPolicyRule(Collections.emptyList());
+        final AndPolicyRule rule = newAndPolicyRule(CollectionSupport.emptyList());
         rule.setId("test");
         rule.initialize();
     }
 
     @Test public void testMatches() throws ComponentInitializationException {
-        AndPolicyRule rule = newAndPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
+        AndPolicyRule rule = newAndPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newAndPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.MATCHES_NONE));
+        rule = newAndPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.MATCHES_NONE));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newAndPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.MATCHES_ALL));
+        rule = newAndPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.MATCHES_ALL));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.TRUE);
 
-        rule = newAndPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
+        rule = newAndPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_ALL, PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FAIL);
     }
     
     @Test public void testSingletons() throws ComponentInitializationException {
-        AndPolicyRule rule = newAndPolicyRule(Collections.singletonList(PolicyRequirementRule.MATCHES_NONE));
+        AndPolicyRule rule = newAndPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.MATCHES_NONE));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newAndPolicyRule(Collections.singletonList(PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
+        rule = newAndPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FAIL);
 
-        rule = newAndPolicyRule(Collections.singletonList(PolicyRequirementRule.MATCHES_ALL));
+        rule = newAndPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.MATCHES_ALL));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.TRUE);
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRuleTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRuleTest.java
index 5b048a9f1..6e4d4bd89 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRuleTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/logic/impl/OrPolicyRuleTest.java
@@ -19,8 +19,6 @@ package net.shibboleth.idp.attribute.filter.policyrule.logic.impl;
 
 import static org.testng.Assert.*;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -32,6 +30,7 @@ import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule.Tristate;
 import net.shibboleth.idp.attribute.filter.matcher.impl.AbstractMatcherPolicyRuleTest;
 import net.shibboleth.idp.attribute.filter.matcher.impl.DataSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link OrPolicyRule} unit test. */
@@ -50,29 +49,29 @@ public class OrPolicyRuleTest extends AbstractMatcherPolicyRuleTest {
     }
 
     @Test public void testMatches() throws ComponentInitializationException {
-        OrPolicyRule rule = newOrPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
+        OrPolicyRule rule = newOrPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newOrPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
+        rule = newOrPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE));
 
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newOrPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_ALL));
+        rule = newOrPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_ALL));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.TRUE);
         
-        rule = newOrPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_ALL,
+        rule = newOrPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_ALL,
                 PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.TRUE);
 
-        rule = newOrPolicyRule(Arrays.asList(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE,
+        rule = newOrPolicyRule(CollectionSupport.listOf(PolicyRequirementRule.MATCHES_NONE, PolicyRequirementRule.MATCHES_NONE,
                 PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
         rule.setId("Test");
         rule.initialize();
@@ -80,17 +79,17 @@ public class OrPolicyRuleTest extends AbstractMatcherPolicyRuleTest {
     }
     
     @Test public void testSingletons() throws ComponentInitializationException {
-        OrPolicyRule rule = newOrPolicyRule(Collections.singletonList(PolicyRequirementRule.MATCHES_NONE));
+        OrPolicyRule rule = newOrPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.MATCHES_NONE));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FALSE);
 
-        rule = newOrPolicyRule(Collections.singletonList(PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
+        rule = newOrPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.REQUIREMENT_RULE_FAILS));
         rule.setId("Test");
         rule.initialize();
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.FAIL);
 
-        rule = newOrPolicyRule(Collections.singletonList(PolicyRequirementRule.MATCHES_ALL));
+        rule = newOrPolicyRule(CollectionSupport.singletonList(PolicyRequirementRule.MATCHES_ALL));
         rule.setId("Test");
         rule.initialize();  
         assertEquals(rule.matches(DataSources.unPopulatedFilterContext()), Tristate.TRUE);
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
index 8afc41d91..7d6da76f2 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/policyrule/saml/impl/BaseMetadataTests.java
@@ -17,9 +17,6 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.saml.impl;
 
-import java.util.Arrays;
-import java.util.Collections;
-
 import javax.annotation.Nonnull;
 
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
@@ -28,6 +25,7 @@ import net.shibboleth.idp.attribute.transcoding.BasicNamingFunction;
 import net.shibboleth.idp.attribute.transcoding.impl.AttributeTranscoderRegistryImpl;
 import net.shibboleth.idp.saml.attribute.impl.AttributeMappingNodeProcessor;
 import net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.MockApplicationContext;
 import net.shibboleth.shared.testing.MockReloadableService;
@@ -71,13 +69,13 @@ public class BaseMetadataTests extends XMLObjectBaseTestCase {
         
         final AttributeTranscoderRegistryImpl registry = new AttributeTranscoderRegistryImpl();
         registry.setId("test");
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(Attribute.class, new AbstractSAML2AttributeTranscoder.NamingFunction())));
         registry.setApplicationContext(new MockApplicationContext());
         registry.initialize();
         
         final NodeProcessingMetadataFilter filter = new NodeProcessingMetadataFilter();
-        filter.setNodeProcessors(Arrays.asList(new EntitiesDescriptorNameProcessor(),
+        filter.setNodeProcessors(CollectionSupport.listOf(new EntitiesDescriptorNameProcessor(),
                 new AttributeMappingNodeProcessor(new MockReloadableService<AttributeTranscoderRegistry>(registry))));
         filter.initialize();
         filter.filter(metadata, new MetadataFilterContext());
diff --git a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
index 0c96b40ef..b3169a76f 100644
--- a/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
+++ b/shib-attribute-filter-impl/src/test/java/net/shibboleth/idp/attribute/filter/tests/AttributeFilterPolicyTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.attribute.filter.tests;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 
@@ -34,6 +32,7 @@ import net.shibboleth.idp.attribute.filter.context.AttributeFilterWorkContext;
 import net.shibboleth.idp.attribute.filter.testing.MockMatcher;
 import net.shibboleth.idp.attribute.filter.testing.MockPolicyRequirementRule;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
 import net.shibboleth.shared.component.UninitializedComponentException;
@@ -73,7 +72,7 @@ public class AttributeFilterPolicyTest {
     }
 
     @Test public void testPostConstructionState() {
-        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
         Assert.assertEquals(policy.getId(), ID);
         Assert.assertEquals(policy.getPolicyRequirementRule(), policyMatcher);
         Assert.assertTrue(policy.getAttributeRules().contains(valuePolicy));
@@ -84,14 +83,14 @@ public class AttributeFilterPolicyTest {
         Assert.assertTrue(policy.getAttributeRules().isEmpty());
 
         try {
-            new AttributeFilterPolicy("", policyMatcher, Arrays.asList(valuePolicy));
+            new AttributeFilterPolicy("", policyMatcher, CollectionSupport.listOf(valuePolicy));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected
         }
 
         try {
-            new AttributeFilterPolicy("  ", policyMatcher, Arrays.asList(valuePolicy));
+            new AttributeFilterPolicy("  ", policyMatcher, CollectionSupport.listOf(valuePolicy));
             Assert.fail();
         } catch (final ConstraintViolationException e) {
             // expected
@@ -99,14 +98,14 @@ public class AttributeFilterPolicyTest {
     }
 
     @Test public void testInitDestroy() throws ComponentInitializationException {
-        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
         Assert.assertFalse(policy.isInitialized(), "Created");
 
         Assert.assertFalse(policy.isDestroyed(), "Created");
         Assert.assertFalse(policyMatcher.isDestroyed(), "Created");
         Assert.assertFalse(valueMatcher.isDestroyed(), "Created");
 
-        policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
         policy.initialize();
         Assert.assertTrue(policy.isInitialized(), "Initialized");
         Assert.assertTrue(policyMatcher.isInitialized(), "Initialized");
@@ -143,7 +142,7 @@ public class AttributeFilterPolicyTest {
             // expected
         }
 
-        policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
         Assert.assertEquals(policy.getAttributeRules().size(), 1);
 
         policy.initialize();
@@ -153,7 +152,7 @@ public class AttributeFilterPolicyTest {
 
     private AttributeFilterContext apply(Tristate state) throws AttributeFilterException, ComponentInitializationException {
 
-        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
 
         try {
             policy.apply(new AttributeFilterContext());
@@ -169,17 +168,16 @@ public class AttributeFilterPolicyTest {
 
         IdPAttribute attribute = new IdPAttribute(ATTR_NAME);
 
-        attribute.setValues(Arrays.asList(new StringAttributeValue("one"),
+        attribute.setValues(CollectionSupport.listOf(new StringAttributeValue("one"),
                 new StringAttributeValue("two"), new StringAttributeValue("three")));
 
         IdPAttribute attribute2 = new IdPAttribute(ATTR_NAME_2);
-        attribute2.setValues(Collections.singletonList(new StringAttributeValue("45")));
-        context.setPrefilteredIdPAttributes(Arrays.asList(attribute, attribute2));
+        attribute2.setValues(CollectionSupport.singletonList(new StringAttributeValue("45")));
+        context.setPrefilteredIdPAttributes(CollectionSupport.listOf(attribute, attribute2));
 
         policyMatcher.setRetVal(state);
         valueMatcher.setMatchingAttribute(ATTR_NAME);
-        valueMatcher.setMatchingValues(Arrays
-                .asList(new StringAttributeValue("one"), new StringAttributeValue("three")));
+        valueMatcher.setMatchingValues(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue("three")));
 
         policy.apply(context);
         return context;
@@ -194,7 +192,7 @@ public class AttributeFilterPolicyTest {
         final Collection<?> values = workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME);
 
         Assert.assertEquals(values.size(), 2);
-        Assert.assertTrue(values.containsAll(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue(
+        Assert.assertTrue(values.containsAll(CollectionSupport.listOf(new StringAttributeValue("one"), new StringAttributeValue(
                 "three"))));
 
         Assert.assertNull(workCtx.getPermittedIdPAttributeValues().get(ATTR_NAME_2));
@@ -211,7 +209,7 @@ public class AttributeFilterPolicyTest {
 }
 
     @Test public void testApplyToEmpty() throws ComponentInitializationException, AttributeFilterException {
-        final AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, Arrays.asList(valuePolicy));
+        final AttributeFilterPolicy policy = new AttributeFilterPolicy(ID, policyMatcher, CollectionSupport.listOf(valuePolicy));
         //
         // Empty attribute
         //
@@ -219,8 +217,8 @@ public class AttributeFilterPolicyTest {
         final AttributeFilterWorkContext workCtx = ctx.ensureSubcontext(AttributeFilterWorkContext.class);
         
         final IdPAttribute attribute = new IdPAttribute(ATTR_NAME);
-        attribute.setValues(Collections.emptyList());
-        ctx.setPrefilteredIdPAttributes(Arrays.asList(attribute));
+        attribute.setValues(CollectionSupport.emptyList());
+        ctx.setPrefilteredIdPAttributes(CollectionSupport.listOf(attribute));
         policy.initialize();
         policy.apply(ctx);
         Assert.assertTrue(workCtx.getPermittedIdPAttributeValues().isEmpty());
diff --git a/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/AttributeFilterServiceTest.java b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/AttributeFilterServiceTest.java
index 671ceed69..da0433b53 100644
--- a/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/AttributeFilterServiceTest.java
+++ b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/AttributeFilterServiceTest.java
@@ -21,9 +21,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -41,6 +39,7 @@ import net.shibboleth.idp.attribute.filter.AttributeFilterException;
 import net.shibboleth.idp.attribute.filter.AttributeFilterPolicy;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.idp.attribute.filter.impl.AttributeFilterImpl;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.service.ServiceException;
 import net.shibboleth.shared.spring.config.IdentifiableBeanPostProcessor;
@@ -104,20 +103,20 @@ public class AttributeFilterServiceTest {
         attributesToBeFiltered = new HashMap<>();
 
         IdPAttribute firstName = new IdPAttribute("firstName");
-        firstName.setValues(Collections.singletonList(new StringAttributeValue("john")));
+        firstName.setValues(CollectionSupport.singletonList(new StringAttributeValue("john")));
         attributesToBeFiltered.put(firstName.getId(), firstName);
 
         IdPAttribute lastName = new IdPAttribute("lastName");
-        lastName.setValues(Collections.singletonList(new StringAttributeValue("smith")));
+        lastName.setValues(CollectionSupport.singletonList(new StringAttributeValue("smith")));
         attributesToBeFiltered.put(lastName.getId(), lastName);
 
         IdPAttribute email = new IdPAttribute("email");
-        email.setValues(Arrays.asList(new StringAttributeValue("jsmith at example.edu"), new StringAttributeValue(
+        email.setValues(CollectionSupport.listOf(new StringAttributeValue("jsmith at example.edu"), new StringAttributeValue(
                 "john.smith at example.edu")));
         attributesToBeFiltered.put(email.getId(), email);
 
         IdPAttribute affiliation = new IdPAttribute("affiliation");
-        affiliation.setValues(Arrays.asList(new StringAttributeValue("employee"), new StringAttributeValue("staff"),
+        affiliation.setValues(CollectionSupport.listOf(new StringAttributeValue("employee"), new StringAttributeValue("staff"),
                 new StringAttributeValue("illegalValue")));
 
         attributesToBeFiltered.put(affiliation.getId(), affiliation);
diff --git a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
index 53e3846f3..955d97a07 100644
--- a/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
+++ b/shib-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeRegistryServiceStrategy.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.transcoding.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -36,6 +35,7 @@ import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry.NamingFunction;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.NonnullFunction;
@@ -70,7 +70,7 @@ public class AttributeRegistryServiceStrategy extends AbstractIdentifiableInitia
         if (namingFunctions != null) {
             namingRegistry = List.copyOf(namingFunctions);
         } else {
-            namingRegistry = Collections.emptyList();
+            namingRegistry = CollectionSupport.emptyList();
         }
     }
 
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStoreTest.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStoreTest.java
index 56b18715c..32c6baa77 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStoreTest.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/impl/ComputedPairwiseIdStoreTest.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 
@@ -27,6 +26,7 @@ import net.shibboleth.idp.attribute.impl.ComputedPairwiseIdStore.Encoding;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 import org.testng.Assert;
@@ -85,8 +85,8 @@ public class ComputedPairwiseIdStoreTest {
     public void testRevoked() throws Exception {
         final ComputedPairwiseIdStore store = new ComputedPairwiseIdStore();
         store.setSalt(salt);
-        store.setExceptionMap(Collections.singletonMap("foo",
-                Collections.<String,String>singletonMap(SP_ENTITY_ID, null)));
+        store.setExceptionMap(CollectionSupport.singletonMap("foo",
+                CollectionSupport.singletonMap(SP_ENTITY_ID, null)));
         store.initialize();
         
         PairwiseId pid = new PairwiseId();
@@ -101,8 +101,8 @@ public class ComputedPairwiseIdStoreTest {
     public void testRevokedWildcardRP() throws Exception {
         final ComputedPairwiseIdStore store = new ComputedPairwiseIdStore();
         store.setSalt(salt);
-        store.setExceptionMap(Collections.singletonMap("foo",
-                Collections.<String,String>singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE, null)));
+        store.setExceptionMap(CollectionSupport.singletonMap("foo",
+                CollectionSupport.singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE, null)));
         store.initialize();
 
         PairwiseId pid = new PairwiseId();
@@ -117,8 +117,8 @@ public class ComputedPairwiseIdStoreTest {
     public void testRevokedWildcardUser() throws Exception {
         final ComputedPairwiseIdStore store = new ComputedPairwiseIdStore();
         store.setSalt(salt);
-        store.setExceptionMap(Collections.singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE,
-                Collections.<String,String>singletonMap(SP_ENTITY_ID, null)));
+        store.setExceptionMap(CollectionSupport.singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE,
+                CollectionSupport.singletonMap(SP_ENTITY_ID, null)));
         store.initialize();
 
         PairwiseId pid = new PairwiseId();
@@ -157,8 +157,8 @@ public class ComputedPairwiseIdStoreTest {
     public void testComputedIdOverride() throws Exception {
         final ComputedPairwiseIdStore store = new ComputedPairwiseIdStore();
         store.setSalt(salt);
-        store.setExceptionMap(Collections.singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE,
-                Collections.<String,String>singletonMap(SP_ENTITY_ID, salt2)));
+        store.setExceptionMap(CollectionSupport.singletonMap(ComputedPairwiseIdStore.WILDCARD_OVERRIDE,
+                CollectionSupport.singletonMap(SP_ENTITY_ID, salt2)));
         store.initialize();
 
         PairwiseId pid = new PairwiseId();
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
index 28950e339..2427090fb 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.transcoding.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -72,7 +71,7 @@ public class AttributeTranscoderRegistryImplTest {
                         return null;
                     }
             });
-        registry.setNamingRegistry(Collections.singletonList(nf));
+        registry.setNamingRegistry(CollectionSupport.singletonList(nf));
         
         final PairTranscoder transcoder = new PairTranscoder();
         transcoder.initialize();
@@ -224,7 +223,7 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testEncodeStringValues() throws AttributeEncodingException {
         final IdPAttribute foo = new IdPAttribute("foo");
-        foo.setValues(Collections.singletonList(StringAttributeValue.valueOf("value")));
+        foo.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf("value")));
         
         final List<Pair<?,?>> pairs = new ArrayList<>();
         
@@ -247,7 +246,7 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testEncodeSubtypeStringValues() throws AttributeEncodingException {
         final IdPAttribute foo = new IdPAttribute("foo");
-        foo.setValues(Collections.singletonList(StringAttributeValue.valueOf("value")));
+        foo.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf("value")));
         
         final List<MyPair> pairs = new ArrayList<>();
         
@@ -307,7 +306,7 @@ public class AttributeTranscoderRegistryImplTest {
 
     @Test public void testEncodeUnsupportedValues() throws AttributeEncodingException {
         final IdPAttribute foo = new IdPAttribute("foo");
-        foo.setValues(Collections.singletonList(EmptyAttributeValue.ZERO_LENGTH));
+        foo.setValues(CollectionSupport.singletonList(EmptyAttributeValue.ZERO_LENGTH));
         
         final List<Pair<?,?>> pairs = new ArrayList<>();
         
diff --git a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
index 8c697255b..03239b624 100644
--- a/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
+++ b/shib-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/PairTranscoder.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.transcoding.impl;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -33,6 +32,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AbstractAttributeTranscoder;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.attribute.transcoding.TranscodingRule;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -48,7 +48,7 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
     }
 
     /** {@inheritDoc} */
-    public String getEncodedName(@Nonnull TranscodingRule rule) {
+    @Nullable public String getEncodedName(@Nonnull TranscodingRule rule) {
         final String name = rule.get("name", String.class);
         if (name != null) {
             return "{Pair}" + name;
@@ -58,7 +58,7 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
 
     /** {@inheritDoc} */
     @Override
-    public Pair doEncode(@Nullable final ProfileRequestContext profileRequestContext, @Nonnull final IdPAttribute attribute,
+    @Nonnull public Pair doEncode(@Nullable final ProfileRequestContext profileRequestContext, @Nonnull final IdPAttribute attribute,
             @Nonnull final Class<? extends Pair> to, @Nonnull final TranscodingRule rule) throws AttributeEncodingException {
         
         final String name = StringSupport.trimOrNull(rule.get("name", String.class));
@@ -79,7 +79,7 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
 
     /** {@inheritDoc} */
     @Override
-    public IdPAttribute doDecode(@Nullable final ProfileRequestContext profileRequestContext, at Nonnull final Pair input,
+    @Nonnull public IdPAttribute doDecode(@Nullable final ProfileRequestContext profileRequestContext, at Nonnull final Pair input,
             @Nonnull final TranscodingRule rule) throws AttributeDecodingException {
        
         final String id = StringSupport.trimOrNull(rule.get(AttributeTranscoderRegistry.PROP_ID, String.class));
@@ -90,7 +90,7 @@ public class PairTranscoder extends AbstractAttributeTranscoder<Pair> {
         final IdPAttribute idattr = new IdPAttribute(id);
         
         if (input.getSecond() instanceof String) {
-            idattr.setValues(Collections.singletonList(StringAttributeValue.valueOf((String) input.getSecond())));
+            idattr.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf((String) input.getSecond())));
         }
         
         return idattr;
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
index fe3fa34e0..f14e0f14a 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.context;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -32,7 +31,9 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolvedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.ResolvedDataConnector;
 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 net.shibboleth.shared.logic.Constraint;
 
 import org.opensaml.messaging.context.BaseContext;
@@ -66,9 +67,9 @@ public final class AttributeResolverWorkContext extends BaseContext {
      * 
      * @return resolved attribute definitions that been recorded
      */
-    @Nonnull @NonnullElements @Unmodifiable public Map<String, ResolvedAttributeDefinition>
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, ResolvedAttributeDefinition>
             getResolvedIdPAttributeDefinitions() {
-        return Collections.unmodifiableMap(resolvedAttributeDefinitions);
+        return CollectionSupport.copyToMap(resolvedAttributeDefinitions);
     }
 
     /**
@@ -98,8 +99,8 @@ public final class AttributeResolverWorkContext extends BaseContext {
      * 
      * @return resolved data connectors that been recorded
      */
-    @Nonnull @NonnullElements @Unmodifiable public Map<String, ResolvedDataConnector> getResolvedDataConnectors() {
-        return Collections.unmodifiableMap(resolvedDataConnectors);
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public Map<String, ResolvedDataConnector> getResolvedDataConnectors() {
+        return CollectionSupport.copyToMap(resolvedDataConnectors);
     }
 
     /**
@@ -136,10 +137,6 @@ public final class AttributeResolverWorkContext extends BaseContext {
     public void recordFailoverResolution(@Nonnull final DataConnector failedConnector,
             @Nonnull final DataConnector failoverConnector) throws ResolutionException {
 
-        if (failoverConnector == null) {
-            return;
-        }
-
         if (resolvedDataConnectors.containsKey(failedConnector.getId())) {
             throw new ResolutionException("The resolution of data connector " + failedConnector.getId()
                     + " has already been recorded");
diff --git a/shib-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnectorTest.java b/shib-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnectorTest.java
index 276ac6dfc..f12a5a09f 100644
--- a/shib-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnectorTest.java
+++ b/shib-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractDataConnectorTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -46,14 +45,14 @@ public class AbstractDataConnectorTest {
 
     /** Test instantiation and post-instantiation state. */
     @Test public void instantiation() {
-        MockBaseDataConnector connector = new MockBaseDataConnector("foo", Collections.emptyMap());
+        MockBaseDataConnector connector = new MockBaseDataConnector("foo", CollectionSupport.emptyMap());
 
         Assert.assertNull(connector.getFailoverDataConnectorId());
     }
 
     /** Test getting/setting dependency ID. */
     @Test public void failoverDependencyId() {
-        MockBaseDataConnector connector = new MockBaseDataConnector("foo", Collections.emptyMap());
+        MockBaseDataConnector connector = new MockBaseDataConnector("foo", CollectionSupport.emptyMap());
 
         connector.setFailoverDataConnectorId(" foo ");
         assertEquals(connector.getFailoverDataConnectorId(), "foo");
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
index fbcf3019c..0abe776bc 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMap.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Function;
@@ -109,7 +108,7 @@ public class ValueMap implements Function<String, Set<StringAttributeValue>> {
         
         if (attributeValue == null) {
             log.debug("Input value was null, returning empty set");
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
         
         log.debug("Attempting to map attribute value '{}'", attributeValue);
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
index ed8c468a2..86fdc4daa 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/PairwiseIdDataConnector.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.dc.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -299,7 +298,7 @@ public class PairwiseIdDataConnector extends AbstractDataConnector {
         }
         final IdPAttribute attribute = new IdPAttribute(getGeneratedAttributeId());
         attribute.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf(value)));
-        return Collections.singletonMap(getGeneratedAttributeId(), attribute);
+        return CollectionSupport.singletonMap(getGeneratedAttributeId(), attribute);
     }
 
 }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
index faa8d5cbe..d19acf021 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/SimpleStorageMappingStrategy.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.dc.storage.impl;
 
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -31,6 +30,7 @@ import net.shibboleth.idp.attribute.resolver.dc.MappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.storage.StorageMappingStrategy;
 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.StringSupport;
 
@@ -58,9 +58,9 @@ public class SimpleStorageMappingStrategy implements StorageMappingStrategy {
             @Nonnull final StorageRecord<?> results) throws ResolutionException {
         
         final IdPAttribute attribute = new IdPAttribute(attributeId);
-        attribute.setValues(Collections.singletonList(StringAttributeValue.valueOf(results.getValue())));
+        attribute.setValues(CollectionSupport.singletonList(StringAttributeValue.valueOf(results.getValue())));
         
-        return Collections.singletonMap(attributeId, attribute);
+        return CollectionSupport.singletonMap(attributeId, attribute);
     }
 
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
index 24f4e0c4b..403fd3506 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
@@ -22,7 +22,6 @@
 package net.shibboleth.idp.attribute.resolver.dc.storage.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -41,6 +40,7 @@ import net.shibboleth.idp.attribute.resolver.dc.impl.AbstractSearchDataConnector
 import net.shibboleth.idp.attribute.resolver.dc.storage.StorageMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.storage.StorageServiceSearch;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -148,7 +148,7 @@ public class StorageServiceDataConnector
                 if (noResultAnError) {
                     throw new NoResultAnErrorResolutionException(getLogPrefix() + " No record returned");
                 }
-                return Collections.emptyMap();
+                return CollectionSupport.emptyMap();
             }
             
             return getMappingStrategy().map(record);
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
index 650d4b224..24fb3a662 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DateTimeAttributeDefinitionTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.*;
 import java.time.Instant;
 import java.time.format.DateTimeFormatter;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -114,7 +113,8 @@ public class DateTimeAttributeDefinitionTest {
         datetime.setIgnoreConversionErrors(ignore);
         datetime.initialize();
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", CollectionSupport.setOf(datetime, sa), Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl(
+                "foo", CollectionSupport.setOf(datetime, sa), CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
index 9864246e5..d4a4f7ace 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/DecryptedAttributeTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.*;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -48,6 +47,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.resource.Resource;
@@ -104,7 +104,7 @@ public class DecryptedAttributeTest {
         } catch (final ComponentInitializationException e) {
             
         }
-        decrypted.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("foo", "bar")));
+        decrypted.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("foo", "bar")));
 
         try {
             decrypted.initialize();
@@ -154,7 +154,7 @@ public class DecryptedAttributeTest {
         
         // And resolve
         final Set<DataConnector> connectorSet = new LazySet<>();
-        connectorSet.add(TestSources.populatedStaticConnector(List.of(attr1,attr2)));
+        connectorSet.add(TestSources.populatedStaticConnector(CollectionSupport.listOf(attr1,attr2)));
 
         final Set<AttributeDefinition> attributeSet = new LazySet<>();
         attributeSet.add(decrypted);
@@ -239,7 +239,7 @@ public class DecryptedAttributeTest {
 
         final DecryptedAttributeDefinition decrypted = new DecryptedAttributeDefinition();
         decrypted.setId(TEST_ATTRIBUTE_NAME);
-        decrypted.setDataConnectorDependencies(Collections.singleton(depend));
+        decrypted.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         decrypted.setDataSealer(dataSealer);
         decrypted.initialize();
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
index 6ed315230..b9703963a 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.*;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -43,6 +42,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
@@ -69,11 +69,11 @@ public class PrescopedAtributeTest {
 
         // Set the dependency on the data connector
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
-        depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
+        depend.setAttributeNames(CollectionSupport.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter("-");
-        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         attrDef.initialize();
 
         // And resolve
@@ -106,7 +106,7 @@ public class PrescopedAtributeTest {
         // Set the dependency on the data connector
         final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
-        depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
+        depend.setAttributeNames(CollectionSupport.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         dependencySet.add(depend);
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
@@ -135,7 +135,7 @@ public class PrescopedAtributeTest {
 
     @Test public void invalidValueType() throws ComponentInitializationException {
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
-        attr.setValues(Collections.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
+        attr.setValues(CollectionSupport.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
@@ -144,8 +144,8 @@ public class PrescopedAtributeTest {
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter("@");
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
-        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
+        depend.setAttributeNames(CollectionSupport.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         attrDef.initialize();
 
         try {
@@ -170,12 +170,12 @@ public class PrescopedAtributeTest {
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
         
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
+        depend.setAttributeNames(CollectionSupport.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
 
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter("@");
-        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         attrDef.initialize();
         final IdPAttribute result = attrDef.resolve(resolutionContext);
         assert result != null;
@@ -193,7 +193,7 @@ public class PrescopedAtributeTest {
         // Set the dependency on the data connector
         final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
-        depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
+        depend.setAttributeNames(CollectionSupport.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         dependencySet.add(depend);
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
@@ -226,8 +226,8 @@ public class PrescopedAtributeTest {
 
         PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
-        final Set<ResolverDataConnectorDependency> pluginDependencies = Collections.singleton(depend);
+        depend.setAttributeNames(CollectionSupport.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
+        final Set<ResolverDataConnectorDependency> pluginDependencies = CollectionSupport.singleton(depend);
         attrDef.setDataConnectorDependencies(pluginDependencies);
         attrDef.setId(TEST_ATTRIBUTE_NAME);
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
index 7b6054b42..28bf6a743 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
@@ -21,7 +21,6 @@ import static org.testng.Assert.*;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;
@@ -43,6 +42,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
@@ -113,7 +113,7 @@ public class RegexAtributeTest {
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setRegularExpression(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN);
-        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         attrDef.initialize();
 
         final IdPAttribute result = attrDef.resolve(resolutionContext);
@@ -128,7 +128,7 @@ public class RegexAtributeTest {
 
     @Test public void invalidValueType() throws ComponentInitializationException {
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
-        attr.setValues(Collections.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
+        attr.setValues(CollectionSupport.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
@@ -137,7 +137,7 @@ public class RegexAtributeTest {
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setRegularExpression(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN);
         final ResolverDataConnectorDependency depend = TestSources.makeDataConnectorDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
-        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         attrDef.initialize();
 
         try {
@@ -184,7 +184,7 @@ public class RegexAtributeTest {
         RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         final ResolverDataConnectorDependency depend = 
                 TestSources.makeDataConnectorDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
-        final Set<ResolverDataConnectorDependency> pluginDependencies = Collections.singleton(depend);
+        final Set<ResolverDataConnectorDependency> pluginDependencies = CollectionSupport.singleton(depend);
         attrDef.setDataConnectorDependencies(pluginDependencies);
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         try {
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
index f4c1cd64c..a4edba191 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.*;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -150,7 +149,7 @@ public class ScopedAttributeTest {
 
     @Test public void invalidValueType() throws ComponentInitializationException {
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
-        attr.setValues(Collections.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
+        attr.setValues(CollectionSupport.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
index 4ef1aed92..2508dcd1b 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
@@ -26,7 +26,6 @@ import static org.testng.Assert.fail;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -59,6 +58,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.LoggerFactory;
@@ -104,7 +104,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
 
-        test.setValues(Collections.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
+        test.setValues(CollectionSupport.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -136,7 +136,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
 
-        test.setValues(Collections.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
+        test.setValues(CollectionSupport.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -168,7 +168,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
 
-        test.setValues(Collections.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
+        test.setValues(CollectionSupport.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -191,7 +191,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
 
-        test.setValues(Collections.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
+        test.setValues(CollectionSupport.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -213,7 +213,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
 
-        test.setValues(Collections.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
+        test.setValues(CollectionSupport.singletonList(new StringAttributeValue(SIMPLE_VALUE)));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -234,7 +234,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         final IdPAttribute test = new IdPAttribute(TEST_ATTRIBUTE_NAME);
         final IdPAttributeValue attributeValue = new StringAttributeValue(SIMPLE_VALUE);
 
-        test.setValues(Collections.singletonList(attributeValue));
+        test.setValues(CollectionSupport.singletonList(attributeValue));
 
         final ScriptedAttributeDefinition attr = new ScriptedAttributeDefinition();
         assertNull(attr.getScript());
@@ -374,7 +374,7 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(getScript("attributes.script"));
-        scripted.setDataConnectorDependencies(Collections.singleton(depend));
+        scripted.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         scripted.initialize();
 
         final IdPAttribute result = scripted.resolve(resolutionContext);
@@ -439,22 +439,22 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         assertTrue(values.contains(new StringAttributeValue(TestSources.SP_ENTITY_ID)));
     }
 
-    protected IdPAttribute runExample(final String exampleScript, final String exampleData, final String attributeName)
+    @Nonnull protected IdPAttribute runExample(final String exampleScript, final String exampleData, final String attributeName)
             throws ScriptException, IOException, ComponentInitializationException {
         final SAMLAttributeDataConnector connector = new SAMLAttributeDataConnector();
         connector.setAttributesStrategy(new Locator(exampleData));
         connector.setId("Connector");
 
         final Set<ResolverDataConnectorDependency> ds =
-                Collections.singleton(TestSources.makeDataConnectorDependency("Connector", null));
+                CollectionSupport.singleton(TestSources.makeDataConnectorDependency("Connector", null));
 
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(attributeName);
         scripted.setScript(getScript(exampleScript));
         scripted.setDataConnectorDependencies(ds);
 
-        final Set<DataConnector> dataDefinitions = Collections.singleton((DataConnector) connector);
-        final Set<AttributeDefinition> attrDefinitions = Collections.singleton((AttributeDefinition) scripted);
+        final Set<DataConnector> dataDefinitions = CollectionSupport.singleton((DataConnector) connector);
+        final Set<AttributeDefinition> attrDefinitions = CollectionSupport.singleton((AttributeDefinition) scripted);
 
         final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, dataDefinitions);
         connector.initialize();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
index b1d4d35c5..86012cd9d 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -109,7 +108,7 @@ public class SimpleAttributeTest {
         simple.setStripNulls(strip);
         simple.initialize();
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", CollectionSupport.setOf(simple, sa), Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", CollectionSupport.setOf(simple, sa), CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
index 1eba6ec85..600d2286a 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
@@ -25,7 +25,6 @@ import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -303,7 +302,7 @@ public class TemplateAttributeTest {
         attrDefinitions.add(templateDef);
         attrDefinitions.add(simple);
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
@@ -336,7 +335,7 @@ public class TemplateAttributeTest {
         attrDefinitions.add(TestSources.populatedStaticAttribute());
         attrDefinitions.add(TestSources.populatedStaticAttribute(otherAttrName, 1));
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
@@ -368,7 +367,7 @@ public class TemplateAttributeTest {
         attrDefinitions.add(TestSources.populatedStaticAttribute());
         attrDefinitions.add(TestSources.populatedStaticAttribute(otherAttrName, 0));
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
@@ -391,7 +390,7 @@ public class TemplateAttributeTest {
         templateDef.initialize();
 
         final IdPAttribute attr = new IdPAttribute(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
-        attr.setValues(Collections.singletonList(
+        attr.setValues(CollectionSupport.singletonList(
                 // An attribute value whose native value is a string attribute value
                 // (to show that a non string object gets injected)
                 new IdPAttributeValue() {
@@ -412,7 +411,7 @@ public class TemplateAttributeTest {
         attrDefinitions.add(templateDef);
         attrDefinitions.add(simple);
 
-        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, Collections.emptySet());
+        final AttributeResolverImpl resolver = AttributeResolverImplTest.newAttributeResolverImpl("foo", attrDefinitions, CollectionSupport.emptySet());
         resolver.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
index 90f437750..865f8acc1 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.util.Collections;
 import java.util.Set;
 
 import org.testng.annotations.Test;
@@ -36,6 +35,7 @@ import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.DestroyedComponentException;
@@ -72,7 +72,7 @@ public class MappedAttributeTest {
             // expected this
         }
 
-        definition.setValueMaps(Collections.singleton(substringValueMapping("foo", false, "foo")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("foo", false, "foo")));
 
         definition.initialize();
 
@@ -102,9 +102,9 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 "NoSuchAttribute")));
-        definition.setValueMaps(Collections.singleton(substringValueMapping("foo", false, "foo")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("foo", false, "foo")));
         definition.initialize();
 
         final IdPAttribute result = definition.resolve(resolutionContext);
@@ -122,9 +122,9 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 "NoSuchAttribute")));
-        definition.setValueMaps(Collections.singleton(substringValueMapping("foo", false, "foo")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("foo", false, "foo")));
         definition.setDefaultValue("");
         assertNull(definition.getDefaultAttributeValue());
         assertNull(definition.getDefaultValue());
@@ -141,16 +141,16 @@ public class MappedAttributeTest {
 
     @Test public void invalidValueType() throws ComponentInitializationException {
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
-        attr.setValues(Collections.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
+        attr.setValues(CollectionSupport.singletonList(new ByteAttributeValue(new byte[] {1, 2, 3})));
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
-        definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("student", false, "student")));
         definition.initialize();
 
         try {
@@ -171,10 +171,10 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         assertTrue(definition.getValueMaps().isEmpty());
-        definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("student", false, "student")));
         assertEquals(definition.getValueMaps().size(), 1);
         definition.initialize();
 
@@ -194,10 +194,10 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         assertTrue(definition.getValueMaps().isEmpty());
-        definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("student", false, "student")));
         assertEquals(definition.getValueMaps().size(), 1);
         definition.initialize();
 
@@ -218,10 +218,10 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         assertTrue(definition.getValueMaps().isEmpty());
-        definition.setValueMaps(Collections.singleton(substringValueMapping("elephant", false, "banana")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("elephant", false, "banana")));
         definition.setDefaultValue("default");
         
         final StringAttributeValue defValue = definition.getDefaultAttributeValue();
@@ -249,10 +249,10 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         assertTrue(definition.getValueMaps().isEmpty());
-        definition.setValueMaps(Collections.singleton(substringValueMapping("elephant", false, "banana")));
+        definition.setValueMaps(CollectionSupport.singleton(substringValueMapping("elephant", false, "banana")));
         definition.setDefaultValue("default");
         
         final StringAttributeValue defValue = definition.getDefaultAttributeValue();
@@ -274,7 +274,7 @@ public class MappedAttributeTest {
     protected ValueMap substringValueMapping(final String targetValue, final boolean caseInsensitive, final String returnValue) throws ComponentInitializationException {
         final ValueMap retVal = new ValueMap();
         retVal.setReturnValue(returnValue);
-        retVal.setSourceValues(Collections.singleton(SourceValueTest.newSourceValue(returnValue, caseInsensitive, true)));
+        retVal.setSourceValues(CollectionSupport.singleton(SourceValueTest.newSourceValue(returnValue, caseInsensitive, true)));
         return retVal;
     }
     
@@ -286,14 +286,14 @@ public class MappedAttributeTest {
 
         final ValueMap valueMap = new ValueMap();
         valueMap.setReturnValue("$1");
-        valueMap.setSourceValues(Collections.singleton(source));
+        valueMap.setSourceValues(CollectionSupport.singleton(source));
         
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency("connector1",
+        definition.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         
-        definition.setValueMaps(Collections.singleton(valueMap));
+        definition.setValueMaps(CollectionSupport.singleton(valueMap));
         definition.initialize();
 
         final AttributeResolutionContext resolutionContext =
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMapTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMapTest.java
index 5b3e8d024..d52278ca5 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMapTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/ValueMapTest.java
@@ -20,13 +20,13 @@ package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.attribute.StringAttributeValue;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -41,7 +41,7 @@ public class ValueMapTest {
         
         final ValueMap map = new ValueMap();
         
-        map.setSourceValues(Collections.singleton(value));
+        map.setSourceValues(CollectionSupport.singleton(value));
         map.setReturnValue("return");
         
         
@@ -55,7 +55,7 @@ public class ValueMapTest {
         
         final ValueMap map = new ValueMap();
         
-        map.setSourceValues(Collections.singleton(value));
+        map.setSourceValues(CollectionSupport.singleton(value));
         map.setReturnValue("return");
         
         Set<StringAttributeValue> result = map.apply("elephant");
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
index e4f53d18d..4bfc38fa8 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnectorTest.java
@@ -25,7 +25,6 @@ import java.io.InputStream;
 import java.net.URISyntaxException;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 
@@ -60,6 +59,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.dc.impl.TestCache;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.httpclient.HttpClientBuilder;
 import net.shibboleth.shared.spring.resource.ResourceHelper;
@@ -92,14 +92,14 @@ public class HTTPDataConnectorTest {
     
     @Test public void test() throws ComponentInitializationException, ResolutionException, ScriptException, IOException {
         final HttpClientSecurityParameters params = new HttpClientSecurityParameters();
-        params.setTLSProtocols(Collections.singleton("TLSv1"));
+        params.setTLSProtocols(CollectionSupport.singleton("TLSv1"));
         connector.setHttpClientSecurityParameters(params);
         
         final TemplatedURLBuilder builder = new TemplatedURLBuilder();
         builder.setTemplateText(TEST_URL);
         builder.setVelocityEngine(VelocityEngine.newVelocityEngine());
         builder.setHttpClientSecurityParameters(params);
-        builder.setHeaders(Collections.singletonMap("Accept", "test/html"));
+        builder.setHeaders(CollectionSupport.singletonMap("Accept", "test/html"));
         builder.initialize();
         
         connector.setExecutableSearchBuilder(builder);
@@ -109,8 +109,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -139,7 +139,7 @@ public class HTTPDataConnectorTest {
         connector.setHttpClient(clientBuilder.buildClient());
 
         final HttpClientSecurityParameters params = new HttpClientSecurityParameters();
-        params.setTLSProtocols(Collections.singleton("SSLv3"));
+        params.setTLSProtocols(CollectionSupport.singleton("SSLv3"));
         params.setTLSTrustEngine(buildExplicitKeyTrustEngine("repo-entity.crt"));
         connector.setHttpClientSecurityParameters(params);
 
@@ -155,8 +155,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -180,8 +180,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "testsize.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -205,8 +205,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -228,7 +228,7 @@ public class HTTPDataConnectorTest {
         
         final ScriptedResponseMappingStrategy mapping = ScriptedResponseMappingStrategy.inlineScript("1");
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_NOT_FOUND));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_NOT_FOUND));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -253,8 +253,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         
@@ -286,8 +286,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         connector.initialize();
@@ -322,8 +322,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         
@@ -355,8 +355,8 @@ public class HTTPDataConnectorTest {
                 ScriptedResponseMappingStrategy.resourceScript(
                         ResourceHelper.of(new ClassPathResource((SCRIPT_PATH) + "test.js")));
         mapping.setLogPrefix(TEST_CONNECTOR_NAME + ":");
-        mapping.setAcceptStatuses(Collections.singleton(HttpStatus.SC_OK));
-        mapping.setAcceptTypes(Collections.singleton("application/json"));
+        mapping.setAcceptStatuses(CollectionSupport.singleton(HttpStatus.SC_OK));
+        mapping.setAcceptTypes(CollectionSupport.singleton("application/json"));
         
         connector.setMappingStrategy(mapping);
         
@@ -377,9 +377,9 @@ public class HTTPDataConnectorTest {
     public static TrustEngine<? super X509Credential> buildPKIXTrustEngine(String cert, String name, boolean nameCheckEnabled) throws URISyntaxException, CertificateException, IOException {
         final InputStream certStream = FileBackedHTTPMetadataResolver.class.getResourceAsStream((SCRIPT_PATH + cert));
         final X509Certificate rootCert = X509Support.decodeCertificate(ByteStreams.toByteArray(certStream));
-        final PKIXValidationInformation info = new BasicPKIXValidationInformation(Collections.singletonList(rootCert), null, 5);
-        final Set<String> trustedNames = name != null ? Collections.singleton(name) : Collections.emptySet();
-        final StaticPKIXValidationInformationResolver resolver = new StaticPKIXValidationInformationResolver(Collections.singletonList(info), trustedNames);
+        final PKIXValidationInformation info = new BasicPKIXValidationInformation(CollectionSupport.singletonList(rootCert), null, 5);
+        final Set<String> trustedNames = name != null ? CollectionSupport.singleton(name) : CollectionSupport.emptySet();
+        final StaticPKIXValidationInformationResolver resolver = new StaticPKIXValidationInformationResolver(CollectionSupport.singletonList(info), trustedNames);
         return new PKIXX509CredentialTrustEngine(resolver,
                 new CertPathPKIXTrustEvaluator(),
                 (nameCheckEnabled ? new BasicX509CredentialNameEvaluator() : null));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
index 8f1417381..bfc4a626b 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -49,6 +48,7 @@ import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImplTest;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.InitializableComponent;
 
@@ -91,7 +91,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         
         final PairwiseIdDataConnector connector = new PairwiseIdDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setAttributeDependencies(Collections.singleton(TestSources.makeAttributeDefinitionDependency(
+        connector.setAttributeDependencies(CollectionSupport.singleton(TestSources.makeAttributeDefinitionDependency(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
         testInit(connector, "No salt");
         connector.setPairwiseIdStore(store);
@@ -100,7 +100,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
         		TEST_ATTRIBUTE_NAME)));
 
         final Set<AttributeDefinition> set = new HashSet<>(2);
@@ -108,7 +108,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         set.add(TestSources.populatedStaticAttribute(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR, 1));
 
         final AttributeResolverImpl resolver =
-                AttributeResolverImplTest.newAttributeResolverImpl("atresolver", set, Collections.singleton((DataConnector) connector));
+                AttributeResolverImplTest.newAttributeResolverImpl("atresolver", set, CollectionSupport.singleton((DataConnector) connector));
 
         simple.initialize();
         resolver.initialize();
@@ -150,14 +150,14 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         }
         
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setAttributeDependencies(Collections.singleton(TestSources.makeAttributeDefinitionDependency(
+        connector.setAttributeDependencies(CollectionSupport.singleton(TestSources.makeAttributeDefinitionDependency(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
 
         connector.initialize();
         
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
                 TEST_CONNECTOR_NAME)));
         simple.initialize();
 
@@ -166,7 +166,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         set.add(TestSources.populatedStaticAttribute(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR, values));
 
-        return AttributeResolverImplTest.newAttributeResolverImpl("atresolver", set, Collections.singleton((DataConnector) connector));
+        return AttributeResolverImplTest.newAttributeResolverImpl("atresolver", set, CollectionSupport.singleton((DataConnector) connector));
     }
 
     protected static PairwiseIdDataConnector connectorFromResolver(final AttributeResolverImpl resolver) {
@@ -236,7 +236,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final PairwiseIdDataConnector connector = new PairwiseIdDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency(
+        connector.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency(
                 TestSources.STATIC_CONNECTOR_NAME, TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR)));
         connector.setGeneratedAttributeId("wibble");
         connector.setPairwiseIdStore(store);
@@ -248,12 +248,12 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency(TEST_CONNECTOR_NAME,
                 "wibble")));
         simple.initialize();
 
         final AttributeResolverImpl resolver =
-                AttributeResolverImplTest.newAttributeResolverImpl("atresolver", Collections.singleton((AttributeDefinition) simple), set);
+                AttributeResolverImplTest.newAttributeResolverImpl("atresolver", CollectionSupport.singleton((AttributeDefinition) simple), set);
         resolver.initialize();
 
         final AttributeResolutionContext context =
@@ -291,7 +291,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final PairwiseIdDataConnector connector = new PairwiseIdDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDataConnectorDependencies(Collections.singleton(depend));
+        connector.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         connector.setGeneratedAttributeId("wibble");
         connector.setPairwiseIdStore(store);
         connector.initialize();
@@ -323,7 +323,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final PairwiseIdDataConnector connector = new PairwiseIdDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDataConnectorDependencies(Collections.singleton(depend));
+        connector.setDataConnectorDependencies(CollectionSupport.singleton(depend));
         connector.setGeneratedAttributeId("wibble");
         connector.setPairwiseIdStore(store);
         connector.initialize();
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
index 02f68fe6a..35c007aa3 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnectorTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.resolver.dc.impl;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Map;
 
 import javax.annotation.Nonnull;
@@ -35,6 +34,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.scripting.EvaluableScript;
 
@@ -74,7 +74,7 @@ public class ScriptedDataConnectorTest {
         connector.setId("Scripted");
         
         final IdPAttribute attribute = new IdPAttribute("attr");
-        attribute.setValues(Collections.singletonList((IdPAttributeValue)new StringAttributeValue("bar")));
+        attribute.setValues(CollectionSupport.singletonList((IdPAttributeValue)new StringAttributeValue("bar")));
         connector.setCustomObject(attribute);
         
         connector.setScript(getScript("custom.js"));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
index ac1ae85bc..bb1f025e7 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.resolver.dc.ldap.impl;
 import static org.testng.Assert.*;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -52,6 +51,7 @@ import net.shibboleth.idp.attribute.resolver.dc.ldap.SearchResultMappingStrategy
 import net.shibboleth.idp.attribute.resolver.dc.ldap.StringAttributeValueMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.ldap.TemplatedExecutableSearchFilterBuilder;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponentException;
 import net.shibboleth.shared.testing.InMemoryDirectory;
@@ -264,7 +264,7 @@ public class LDAPDataConnectorTest {
         final AttributeResolutionContext context =
                 TestSources.createResolutionContext("domain\\user*", TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
-        final ExecutableSearchFilter filter = builder.build(context, Collections.emptyMap());
+        final ExecutableSearchFilter filter = builder.build(context, CollectionSupport.emptyMap());
         assertEquals(filter.getSearchFilter().format(), "(cn=domain\\5Cuser\\2A)");
         assertEquals(filter.getResultCacheKey(), "(cn=domain\\5Cuser\\2A)");
     }
@@ -339,7 +339,7 @@ public class LDAPDataConnectorTest {
         final AttributeResolutionContext context =
                 TestSources.createResolutionContext("domain\\user*", TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
-        final ExecutableSearchFilter filter = builder.build(context, Collections.emptyMap());
+        final ExecutableSearchFilter filter = builder.build(context, CollectionSupport.emptyMap());
         assertEquals(filter.getSearchFilter().format(), "(cn=domain\\5Cuser\\2A)");
         assertEquals(filter.getResultCacheKey(), "(cn=domain\\5Cuser\\2A)");
     }
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
index f33531b59..10d511e42 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.*;
 import java.sql.SQLException;
 import java.time.Duration;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +47,7 @@ import net.shibboleth.idp.attribute.resolver.dc.rdbms.ResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.StringResultMappingStrategy;
 import net.shibboleth.idp.attribute.resolver.dc.rdbms.TemplatedExecutableStatementBuilder;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponentException;
 import net.shibboleth.shared.testing.DatabaseTestingSupport;
@@ -225,7 +225,7 @@ public class RDBMSDataConnectorTest {
         final AttributeResolutionContext context =
                 TestSources.createResolutionContext("McHale's Navy", TestSources.IDP_ENTITY_ID,
                         TestSources.SP_ENTITY_ID);
-        final String query = builder.getSQLQuery(context, Collections.emptyMap());
+        final String query = builder.getSQLQuery(context, CollectionSupport.emptyMap());
         assertEquals(query, "SELECT userid FROM people WHERE userid='McHale''s Navy'");
     }
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
index f6cc0c0d3..83afe9620 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
@@ -28,7 +28,6 @@ import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -81,8 +80,8 @@ public class AttributeResolverImplTest {
         final MockDataConnector dataCon = new MockDataConnector("bar", (Map<String, IdPAttribute>) null);
         dataCon.initialize();
         final AttributeResolverImpl resolver =
-                newAttributeResolverImpl("toto", Collections.singleton((AttributeDefinition) attrDef),
-                        Collections.singleton((DataConnector) dataCon));
+                newAttributeResolverImpl("toto", CollectionSupport.singleton((AttributeDefinition) attrDef),
+                        CollectionSupport.singleton((DataConnector) dataCon));
 
         assertFalse(attrDef.isInitialized());
         assertFalse(attrDef.isDestroyed());
@@ -174,7 +173,7 @@ public class AttributeResolverImplTest {
      */
     @Test public void resolve() throws Exception {
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         final LazySet<AttributeDefinition> definitions = new LazySet<>();
         definitions.add(new MockAttributeDefinition("ad1", attribute));
@@ -193,13 +192,13 @@ public class AttributeResolverImplTest {
     @Test public void resolveWithExports() throws Exception {
 
         final IdPAttribute attribute1 = new IdPAttribute("ad1");
-        attribute1.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute1.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         final IdPAttribute attribute2 = new IdPAttribute("ad2");
-        attribute2.setValues(Collections.singletonList(new StringAttributeValue("value2")));
+        attribute2.setValues(CollectionSupport.singletonList(new StringAttributeValue("value2")));
         final IdPAttribute attribute3 = new IdPAttribute("ad3");
-        attribute3.setValues(Collections.singletonList(new StringAttributeValue("value3")));
+        attribute3.setValues(CollectionSupport.singletonList(new StringAttributeValue("value3")));
         final IdPAttribute attribute4 = new IdPAttribute("ad4");
-        attribute4.setValues(Collections.singletonList(new StringAttributeValue("value3")));
+        attribute4.setValues(CollectionSupport.singletonList(new StringAttributeValue("value3")));
 
         // Connector2 contributes attribute2, attribute3 attribute4 (but not 1)
         // Connector2 exports 2 & 3 (and would export 1 if it created it)
@@ -236,7 +235,7 @@ public class AttributeResolverImplTest {
      */
     @Test public void resolveSpecificAttribute() throws Exception {
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         final LazySet<AttributeDefinition> definitions = new LazySet<>();
         definitions.add(new MockAttributeDefinition("ad1", attribute));
@@ -262,10 +261,10 @@ public class AttributeResolverImplTest {
 
     @Test public void resolvePreRequestAttribute() throws Exception {
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         final IdPAttribute attribute2 = new IdPAttribute("ad2");
-        attribute2.setValues(Collections.singletonList(new StringAttributeValue("value2")));
+        attribute2.setValues(CollectionSupport.singletonList(new StringAttributeValue("value2")));
 
         final LazySet<AttributeDefinition> definitions = new LazySet<>();
         final AbstractAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attribute);
@@ -298,7 +297,7 @@ public class AttributeResolverImplTest {
     @Test public void resolveFails() throws Exception {
         log.debug("Log Resolve fails");
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         LazySet<AttributeDefinition> definitions = new LazySet<>();
         AbstractAttributeDefinition attrDef = new MockAttributeDefinition("ad1", new ResolutionException());
@@ -361,7 +360,7 @@ public class AttributeResolverImplTest {
         dc1.initialize();
 
         final IdPAttribute attr = new IdPAttribute("test");
-        attr.setValues(Arrays.asList(new StringAttributeValue("a"), new StringAttributeValue("b")));
+        attr.setValues(CollectionSupport.listOf(new StringAttributeValue("a"), new StringAttributeValue("b")));
         
         final ResolverDataConnectorDependency dep1 = new ResolverDataConnectorDependency("dc1");
         dep1.setAllAttributes(true);
@@ -374,7 +373,7 @@ public class AttributeResolverImplTest {
         final ResolverAttributeDefinitionDependency dep2 = new ResolverAttributeDefinitionDependency("ad1");
         final ResolverAttributeDefinitionDependency dep3 = new ResolverAttributeDefinitionDependency("ad2");
         final MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", attr);
-        ad0.setAttributeDependencies(new HashSet<>(Arrays.asList(dep2, dep3)));
+        ad0.setAttributeDependencies(new HashSet<>(CollectionSupport.listOf(dep2, dep3)));
         ad0.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -436,9 +435,9 @@ public class AttributeResolverImplTest {
     @Test(enabled=true) public void resolveWithTimeout() throws Exception {
         
         final IdPAttribute i1Val = new IdPAttribute("Atr");
-        i1Val.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        i1Val.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         
-        final MockDataConnector dc1 = new MockDataConnector("dc1", Collections.singletonMap("Atr", i1Val));
+        final MockDataConnector dc1 = new MockDataConnector("dc1", CollectionSupport.singletonMap("Atr", i1Val));
         final SimpleAttributeDefinition ad = new SimpleAttributeDefinition();
         ad.setId("output");
         final ResolverDataConnectorDependency dep1 = TestSources.makeDataConnectorDependency("dc1","Atr");
@@ -450,7 +449,7 @@ public class AttributeResolverImplTest {
         vals.add(new StringAttributeValue("value1"));
         vals.add(new StringAttributeValue("value2"));
         i2Val.setValues(vals);
-        final MockDataConnector dc2 = new MockDataConnector("dc2", Collections.singletonMap("Atr", i2Val));
+        final MockDataConnector dc2 = new MockDataConnector("dc2", CollectionSupport.singletonMap("Atr", i2Val));
         dc2.initialize();
         dc1.setFailoverDataConnectorId("dc2");
         final Duration threeSeconds = Duration.ofSeconds(3);
@@ -462,7 +461,7 @@ public class AttributeResolverImplTest {
         connectors.add(dc2);
         connectors.add(dc1);
         
-        final AttributeResolverImpl resolver = newAttributeResolverImpl("foo", Collections.singleton((AttributeDefinition)ad), connectors);
+        final AttributeResolverImpl resolver = newAttributeResolverImpl("foo", CollectionSupport.singleton((AttributeDefinition)ad), connectors);
         resolver.initialize();
 
         AttributeResolutionContext context = new AttributeResolutionContext();
@@ -566,13 +565,13 @@ public class AttributeResolverImplTest {
 
         final ResolverDataConnectorDependency dep1 = TestSources.makeDataConnectorDependency("dc1", null);
         IdPAttribute attr = new IdPAttribute("test1");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
         ad1.setDataConnectorDependencies(CollectionSupport.singleton(dep1));
         ad1.initialize();
 
         attr = new IdPAttribute("test2");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("value2")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("value2")));
         final MockAttributeDefinition ad2 = new MockAttributeDefinition("ad2", attr);
         ad2.setDataConnectorDependencies(CollectionSupport.singleton(TestSources.makeDataConnectorDependency("dc1", null)));
         ad2.initialize();
@@ -632,7 +631,7 @@ public class AttributeResolverImplTest {
     @Test public void dataConnectorWithDataDependencyOld() throws ComponentInitializationException, ResolutionException {
         final Map<String, IdPAttribute> values = new HashMap<>(1);
         IdPAttribute attr = new IdPAttribute("SubAttribute");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("SubValue1")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("SubValue1")));
 
         values.put("SubAttribute", attr);
         final MockDataConnector dc1 = new MockDataConnector("dc1", values);
@@ -640,7 +639,7 @@ public class AttributeResolverImplTest {
 
         final ResolverDataConnectorDependency dep1 = TestSources.makeDataConnectorDependency("dc1", "SubAttribute");
         attr = new IdPAttribute("test1");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
         ad1.setDataConnectorDependencies(CollectionSupport.singleton(dep1));
         ad1.initialize();
@@ -662,7 +661,7 @@ public class AttributeResolverImplTest {
     @Test public void dataConnectorWithDataDependency() throws ComponentInitializationException, ResolutionException {
         final Map<String, IdPAttribute> values = new HashMap<>(1);
         IdPAttribute attr = new IdPAttribute("SubAttribute");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("SubValue1")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("SubValue1")));
 
         values.put("SubAttribute", attr);
         final MockDataConnector dc1 = new MockDataConnector("dc1", values);
@@ -671,7 +670,7 @@ public class AttributeResolverImplTest {
         final ResolverDataConnectorDependency dep1 = new ResolverDataConnectorDependency("dc1");
         dep1.setAttributeNames(CollectionSupport.singleton("SubAttribute"));
         attr = new IdPAttribute("test1");
-        attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attr.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
         ad1.setDataConnectorDependencies(CollectionSupport.singleton(dep1));
         ad1.initialize();
@@ -718,7 +717,7 @@ public class AttributeResolverImplTest {
      */
     @Test public void resolveCleanDependencyOnly() throws Exception {
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Collections.singletonList(new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
 
         final MockAttributeDefinition definition = new MockAttributeDefinition("ad1", attribute);
         definition.setDependencyOnly(true);
@@ -743,7 +742,7 @@ public class AttributeResolverImplTest {
      */
     @Test public void resolveCleanDuplicateValues() throws Exception {
         final IdPAttribute attribute = new IdPAttribute("ad1");
-        attribute.setValues(Arrays.asList(new StringAttributeValue("value1"), new StringAttributeValue("value1")));
+        attribute.setValues(CollectionSupport.listOf(new StringAttributeValue("value1"), new StringAttributeValue("value1")));
 
         final MockAttributeDefinition definition = new MockAttributeDefinition("ad1", attribute);
 
@@ -932,7 +931,7 @@ public class AttributeResolverImplTest {
             // OK
         }
 
-        final MockDataConnector dc1 = new MockDataConnector("dc1", null, Collections.singleton(TestSources.makeAttributeDefinitionDependency("ad0")), null);
+        final MockDataConnector dc1 = new MockDataConnector("dc1", null, CollectionSupport.singleton(TestSources.makeAttributeDefinitionDependency("ad0")), null);
 
         ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
         ad1.setAttributeDependencies(CollectionSupport.singleton(TestSources.makeAttributeDefinitionDependency("dc1")));
@@ -986,7 +985,7 @@ public class AttributeResolverImplTest {
         }
 
         final MockDataConnector dc1 = new MockDataConnector("dc1", null, 
-                Collections.singleton(new ResolverAttributeDefinitionDependency("ad0")), null);
+                CollectionSupport.singleton(new ResolverAttributeDefinitionDependency("ad0")), null);
 
         ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
         ad1.setDataConnectorDependencies(CollectionSupport.singleton(new ResolverDataConnectorDependency("dc1")));
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/AttributeResolverWorkContextTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/AttributeResolverWorkContextTest.java
index 0f1385280..12f40dbdc 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/AttributeResolverWorkContextTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/AttributeResolverWorkContextTest.java
@@ -17,7 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.tests;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -28,6 +27,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.idp.attribute.resolver.testing.MockAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.testing.MockDataConnector;
 import net.shibboleth.idp.attribute.resolver.testing.MockStaticDataConnector;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -137,7 +137,7 @@ public class AttributeResolverWorkContextTest {
         try {
             MockStaticDataConnector other = new MockStaticDataConnector();
             other.setId("bar");
-            other.setValues(Collections.emptyList());
+            other.setValues(CollectionSupport.emptyList());
             other.initialize();
             context.recordDataConnectorResolution(other, null);
             Assert.fail("Cannot cross the same bridge twice or add the same resolvedId twice");
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
index 363070b16..1a3de1473 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/PluginDependencySupportTest.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.tests;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -32,6 +30,7 @@ import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContex
 import net.shibboleth.idp.attribute.resolver.testing.MockStaticAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.testing.MockStaticDataConnector;
 import net.shibboleth.idp.attribute.resolver.testing.ResolverTestSupport;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -49,8 +48,8 @@ public class PluginDependencySupportTest {
 
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
-                        Collections.<ResolverDataConnectorDependency>emptyList(),
+                        CollectionSupport.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        CollectionSupport.emptyList(),
                         ResolverTestSupport.EPA_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -69,8 +68,8 @@ public class PluginDependencySupportTest {
 
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
-                        Collections.<ResolverDataConnectorDependency>emptyList(),
+                        CollectionSupport.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        CollectionSupport.emptyList(),
                         ResolverTestSupport.EPA_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -90,11 +89,11 @@ public class PluginDependencySupportTest {
         assert workContext != null;
 
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPE_ATTRIB_ID));
+        depend.setAttributeNames(CollectionSupport.singletonList(ResolverTestSupport.EPE_ATTRIB_ID));
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
-                        Collections.singletonList(depend),
+                        CollectionSupport.emptyList(),
+                        CollectionSupport.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -115,11 +114,11 @@ public class PluginDependencySupportTest {
         assert workContext != null;
 
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(Collections.singleton(ResolverTestSupport.EPE_ATTRIB_ID));
+        depend.setAttributeNames(CollectionSupport.singleton(ResolverTestSupport.EPE_ATTRIB_ID));
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
-                        Collections.singletonList(depend),
+                        CollectionSupport.emptyList(),
+                        CollectionSupport.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -140,12 +139,12 @@ public class PluginDependencySupportTest {
         assert workContext != null;
 
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
-        depend.setAttributeNames(List.of(ResolverTestSupport.EPE_ATTRIB_ID, ResolverTestSupport.EPA_ATTRIB_ID));
+        depend.setAttributeNames(CollectionSupport.listOf(ResolverTestSupport.EPE_ATTRIB_ID, ResolverTestSupport.EPA_ATTRIB_ID));
 
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
-                        Collections.singletonList(depend),
+                        CollectionSupport.emptyList(),
+                        CollectionSupport.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -171,8 +170,8 @@ public class PluginDependencySupportTest {
         depend.setAllAttributes(true);
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
-                        Collections.singletonList(depend),
+                        CollectionSupport.emptyList(),
+                        CollectionSupport.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -202,11 +201,11 @@ public class PluginDependencySupportTest {
 
         final ResolverDataConnectorDependency dependConnector = new ResolverDataConnectorDependency("connector1");
         
-        dependConnector.setAttributeNames(Collections.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
+        dependConnector.setAttributeNames(CollectionSupport.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
         final List<IdPAttributeValue> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
-                        Collections.singletonList(dependConnector),
+                        CollectionSupport.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        CollectionSupport.singletonList(dependConnector),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -238,8 +237,8 @@ public class PluginDependencySupportTest {
 
         final Map<String, List<IdPAttributeValue>> result =
                 PluginDependencySupport.getAllAttributeValues(workContext,
-                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
-                        Collections.singletonList(depend));
+                        CollectionSupport.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        CollectionSupport.singletonList(depend));
 
         Assert.assertNotNull(result);
         Assert.assertEquals(result.size(), 2);
@@ -276,11 +275,11 @@ public class PluginDependencySupportTest {
 
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
 
-        depend.setAttributeNames(Collections.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
+        depend.setAttributeNames(CollectionSupport.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
         final Map<String, List<IdPAttributeValue>> result =
                 PluginDependencySupport.getAllAttributeValues(workContext,
-                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
-                        Collections.singletonList(depend));
+                        CollectionSupport.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        CollectionSupport.singletonList(depend));
 
         Assert.assertNotNull(result);
         Assert.assertEquals(result.size(), 1);
@@ -316,8 +315,8 @@ public class PluginDependencySupportTest {
         Assert.assertEquals(dc1.hashCode(), dc2.hashCode());
         Assert.assertNotEquals(dc2.hashCode(), dc3.hashCode());
         
-        dc1.setAttributeNames(Arrays.asList("a", "b"));
-        dc2.setAttributeNames(Arrays.asList("b", "a"));
+        dc1.setAttributeNames(CollectionSupport.listOf("a", "b"));
+        dc2.setAttributeNames(CollectionSupport.listOf("b", "a"));
 
         Assert.assertEquals(dc1, dc2);
         Assert.assertNotEquals(dc2, dc3);
@@ -336,7 +335,7 @@ public class PluginDependencySupportTest {
         Assert.assertEquals(dc1.hashCode(), dc2.hashCode());
         Assert.assertNotEquals(dc2.hashCode(), dc3.hashCode());
 
-        dc2.setAttributeNames(Arrays.asList("b", "a", "d"));
+        dc2.setAttributeNames(CollectionSupport.listOf("b", "a", "d"));
         Assert.assertNotEquals(dc1, dc2);
         Assert.assertNotEquals(dc2, dc3);
         Assert.assertNotEquals(dc1.hashCode(), dc2.hashCode());
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedAttributeDefinitionTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedAttributeDefinitionTest.java
index 3a5a605c6..e72419f32 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedAttributeDefinitionTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedAttributeDefinitionTest.java
@@ -17,18 +17,18 @@
 
 package net.shibboleth.idp.attribute.resolver.tests;
 
-import java.util.Collections;
-
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.resolver.ResolvedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.testing.MockStaticAttributeDefinition;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 import org.testng.Assert;
 import org.testng.annotations.Test;
+
 /**
  * Largely boilerplate test for {@link ResolvedAttributeDefinition}.
  */
@@ -92,10 +92,10 @@ public class ResolvedAttributeDefinitionTest {
         attrDef.setValue(attribute);
         attrDef.setId("Defn");
         final ResolverAttributeDefinitionDependency dep = new ResolverAttributeDefinitionDependency("doo");
-        attrDef.setAttributeDependencies(Collections.singleton(dep));
+        attrDef.setAttributeDependencies(CollectionSupport.singleton(dep));
         final ResolverDataConnectorDependency ddep = new ResolverDataConnectorDependency("ddoo");
-        ddep.setAttributeNames(Collections.singletonList("foo"));
-        attrDef.setDataConnectorDependencies(Collections.singleton(ddep));
+        ddep.setAttributeNames(CollectionSupport.singletonList("foo"));
+        attrDef.setDataConnectorDependencies(CollectionSupport.singleton(ddep));
         attrDef.setPropagateResolutionExceptions(false);
         attrDef.initialize();
 
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedDataConnectorTest.java
index 2568452c2..fcb04f944 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/tests/ResolvedDataConnectorTest.java
@@ -17,8 +17,6 @@
 
 package net.shibboleth.idp.attribute.resolver.tests;
 
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.Map;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
@@ -27,6 +25,7 @@ import net.shibboleth.idp.attribute.resolver.ResolvedDataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.testing.MockStaticDataConnector;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
@@ -40,7 +39,7 @@ import org.testng.annotations.Test;
 @SuppressWarnings("javadoc")
 public class ResolvedDataConnectorTest {
 
-    private final Map<String, IdPAttribute> resolvedData = Collections.emptyMap();
+    private final Map<String, IdPAttribute> resolvedData = CollectionSupport.emptyMap();
 
     @Test public void init() {
         final MockStaticDataConnector dc = new MockStaticDataConnector();
@@ -64,7 +63,7 @@ public class ResolvedDataConnectorTest {
     @SuppressWarnings("unlikely-arg-type")
     @Test public void equalsHashToString() throws ComponentInitializationException {
         MockStaticDataConnector dc = new MockStaticDataConnector();
-        dc.setValues(Arrays.asList(new IdPAttribute("attr")));
+        dc.setValues(CollectionSupport.singletonList(new IdPAttribute("attr")));
         dc.setId("Defn");
         dc.initialize();
         ResolvedDataConnector resolvedDataConnector = new ResolvedDataConnector(dc, resolvedData);
@@ -75,7 +74,7 @@ public class ResolvedDataConnectorTest {
 
         MockStaticDataConnector otherDef = new MockStaticDataConnector();
         otherDef.setId("OtherDefn");
-        otherDef.setValues(Arrays.asList(new IdPAttribute("otherAttr")));
+        otherDef.setValues(CollectionSupport.singletonList(new IdPAttribute("otherAttr")));
         otherDef.initialize();
         otherDc = new ResolvedDataConnector(otherDef, resolvedData);
 
@@ -93,14 +92,14 @@ public class ResolvedDataConnectorTest {
     @Test public void noops() throws ComponentInitializationException ,
             ResolutionException {
         MockStaticDataConnector dc = new MockStaticDataConnector();
-        dc.setValues(Arrays.asList(new IdPAttribute("attr")));
+        dc.setValues(CollectionSupport.singletonList(new IdPAttribute("attr")));
         dc.setId("Defn");
         
         final ResolverAttributeDefinitionDependency dep = new ResolverAttributeDefinitionDependency("doo");
-        dc.setAttributeDependencies(Collections.singleton(dep));
+        dc.setAttributeDependencies(CollectionSupport.singleton(dep));
         final ResolverDataConnectorDependency ddep = new ResolverDataConnectorDependency("ddoo");
-        ddep.setAttributeNames(Collections.singletonList("foo"));
-        dc.setDataConnectorDependencies(Collections.singleton(ddep));
+        ddep.setAttributeNames(CollectionSupport.singletonList("foo"));
+        dc.setDataConnectorDependencies(CollectionSupport.singleton(ddep));
 
         dc.setPropagateResolutionExceptions(false);
         dc.initialize();
@@ -119,6 +118,6 @@ public class ResolvedDataConnectorTest {
 
         resolvedDataConnector.setPropagateResolutionExceptions(true);
         Assert.assertFalse(resolvedDataConnector.isPropagateResolutionExceptions());
-
     }
-}
+    
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
index fd2b41687..1d47f003b 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/AttributeMappingNodeProcessorTest.java
@@ -19,10 +19,7 @@ package net.shibboleth.idp.attribute.resolver.spring;
 
 import static org.testng.Assert.*;
 
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -46,6 +43,7 @@ import net.shibboleth.idp.attribute.IdPRequestedAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
 import net.shibboleth.idp.saml.attribute.impl.AttributeMappingNodeProcessor;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.service.ReloadableService;
 import net.shibboleth.shared.spring.config.StringToDurationConverter;
 import net.shibboleth.shared.spring.custom.SchemaTypeAwareXMLBeanDefinitionReader;
@@ -90,7 +88,7 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         context.setDisplayName("ApplicationContext: ");
 
         final ConversionServiceFactoryBean service1 = new ConversionServiceFactoryBean();
-        service1.setConverters(new HashSet<>(Arrays.asList(new StringToDurationConverter())));
+        service1.setConverters(CollectionSupport.singleton(new StringToDurationConverter()));
         service1.afterPropertiesSet();
 
         context.getBeanFactory().setConversionService(service1.getObject());
@@ -132,7 +130,7 @@ public class AttributeMappingNodeProcessorTest extends XMLObjectBaseTestCase {
         assertEquals(sav.getValue(), "http://id.incommon.org/category/research-and-scholarship");
         
         assertEquals(container.getStringValues("http://macedir.org/entity-category"),
-                Collections.singletonList("http://id.incommon.org/category/research-and-scholarship"));
+                CollectionSupport.singletonList("http://id.incommon.org/category/research-and-scholarship"));
     }
 
     @Test public void requiredAttributes() throws FilterException {
diff --git a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
index 970acbaf8..35025cf76 100644
--- a/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
+++ b/shib-attribute-testing/src/main/java/net/shibboleth/idp/attribute/filter/testing/MockMatcher.java
@@ -18,17 +18,18 @@
 package net.shibboleth.idp.attribute.filter.testing;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Objects;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
@@ -77,18 +78,17 @@ public class MockMatcher extends AbstractIdentifiedInitializableComponent implem
     }
 
     /** {@inheritDoc} */
-    @Override
-    public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
+    @Nullable public Set<IdPAttributeValue> getMatchingValues(@Nonnull final IdPAttribute attribute,
             @Nonnull final AttributeFilterContext filterContext) {
         if (fails) {
             return null;
         }
         if (!Objects.equals(attribute.getId(), matchingAttribute)) {
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
 
         if (matchingValues == null) {
-            return Set.copyOf(attribute.getValues());
+            return CollectionSupport.copyToSet(attribute.getValues());
         }
 
         LinkedHashSet<IdPAttributeValue> values = new LinkedHashSet<>();
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
index 3cc4ec1a0..daf2c53ce 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.saml.attribute.resolver.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -39,6 +38,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 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;
 
@@ -197,7 +197,7 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
             if (1 == inputValues.size()) {
                 final IdPAttributeValue val = encodeOneValue(inputValues.iterator().next(), resolutionContext);
                 if (null != val) {
-                    outputValues = Collections.singletonList(val);
+                    outputValues = CollectionSupport.singletonList(val);
                 }
             } else {
                 // TODO(rdw) Fix typing
diff --git a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
index 23a1557c1..f33d2d7e1 100644
--- a/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
+++ b/shib-saml-attribute-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.saml.attribute.resolver.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -40,6 +39,7 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 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;
 
@@ -234,7 +234,7 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
             if (1 == inputValues.size()) {
                 final IdPAttributeValue val = encodeOneValue(inputValues.iterator().next(), resolutionContext);
                 if (null != val) {
-                    outputValues = Collections.singletonList(val);
+                    outputValues = CollectionSupport.singletonList(val);
                 }
             } else {
                 // TODO Intermediate to solve typing issues.
diff --git a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
index 369ffbd57..3e04a35df 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ByteAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.saml.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;
@@ -99,7 +97,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         final SAML1ByteAttributeTranscoder transcoder = new SAML1ByteAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -189,7 +187,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     @Test(expectedExceptions = {AttributeEncodingException.class,}) public void inappropriate() throws Exception {
         final int[] intArray = {1, 2, 3, 4};
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ScopedStringAttributeValue("foo", "bar"),
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ScopedStringAttributeValue("foo", "bar"),
                         new IdPAttributeValue() {
                             @Nonnull public Object getNativeValue() {
                                 return intArray;
@@ -214,7 +212,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void single() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
@@ -252,7 +250,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
 
     @Test public void singleRequested() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
 
         final IdPRequestedAttribute inputAttribute = new IdPRequestedAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
@@ -330,7 +328,7 @@ public class SAML1ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void multi() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(BYTE_ARRAY_1), new ByteAttributeValue(BYTE_ARRAY_2));
+                CollectionSupport.listOf(new ByteAttributeValue(BYTE_ARRAY_1), new ByteAttributeValue(BYTE_ARRAY_2));
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
diff --git a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
index 14954fc79..76d3b65ec 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1ScopedStringAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.saml.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;
@@ -103,7 +101,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         final SAML1ScopedStringAttributeTranscoder transcoder = new SAML1ScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -177,7 +175,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
     @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
                     @Nonnull public Object getNativeValue() {
                         return intArray;
@@ -203,7 +201,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
     
     @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));
@@ -245,7 +243,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
 
     @Test public void singleRequested() 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));
 
         final IdPRequestedAttribute inputAttribute = new IdPRequestedAttribute(ATTR_NAME);
@@ -294,7 +292,7 @@ public class SAML1ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         
     @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/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
index 8f7ab1d07..69070523d 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML1StringAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.saml.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;
@@ -93,7 +91,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         final SAML1StringAttributeTranscoder transcoder = new SAML1StringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML1AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -183,7 +181,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
     @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
                     @Nonnull public Object getNativeValue() {
                         return intArray;
@@ -209,7 +207,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
     
     @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_NAME);
         inputAttribute.setValues(values);
@@ -245,7 +243,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
 
     @Test public void singleRequested() 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 IdPRequestedAttribute inputAttribute = new IdPRequestedAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
@@ -288,7 +286,7 @@ public class SAML1StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         
     @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/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
index 4a11e8f2e..0d4524030 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ByteAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.saml.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;
@@ -100,7 +98,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
         final SAML2ByteAttributeTranscoder transcoder = new SAML2ByteAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -181,7 +179,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     @Test(expectedExceptions = {AttributeEncodingException.class,}) public void inappropriate() throws Exception {
         final int[] intArray = {1, 2, 3, 4};
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ScopedStringAttributeValue("foo", "bar"),
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ScopedStringAttributeValue("foo", "bar"),
                         new IdPAttributeValue() {
                             @Nonnull public Object getNativeValue() {
                                 return intArray;
@@ -206,7 +204,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void single() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
@@ -245,7 +243,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
 
     @Test public void singleRequested() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
+                CollectionSupport.listOf(new StringAttributeValue("foo"), new ByteAttributeValue(BYTE_ARRAY_1));
 
         final IdPRequestedAttribute inputAttribute = new IdPRequestedAttribute(ATTR_NAME);
         inputAttribute.setRequired(true);
@@ -371,7 +369,7 @@ public class SAML2ByteAttributeTranscoderTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void multi() throws Exception {
         final List<IdPAttributeValue> values =
-                Arrays.asList(new ByteAttributeValue(BYTE_ARRAY_1), new ByteAttributeValue(BYTE_ARRAY_2));
+                CollectionSupport.listOf(new ByteAttributeValue(BYTE_ARRAY_1), new ByteAttributeValue(BYTE_ARRAY_2));
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
diff --git a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoderTest.java
index 09d310d03..863122d01 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2DateTimeAttributeTranscoderTest.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.saml.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;
@@ -99,7 +98,7 @@ public class SAML2DateTimeAttributeTranscoderTest extends OpenSAMLInitBaseTestCa
         final SAML2DateTimeAttributeTranscoder transcoder = new SAML2DateTimeAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
diff --git a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
index 6dc7c57be..6d7aeffca 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2ScopedStringAttributeTranscoderTest.java
@@ -17,9 +17,7 @@
 
 package net.shibboleth.idp.saml.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;
@@ -97,7 +95,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
         final SAML2ScopedStringAttributeTranscoder transcoder = new SAML2ScopedStringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -179,7 +177,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
     @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
                     @Nonnull public Object getNativeValue() {
                         return intArray;
@@ -205,7 +203,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
     
     @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));
@@ -248,7 +246,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
 
     @Test public void singleRequested() 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));
 
         final IdPRequestedAttribute inputAttribute = new IdPRequestedAttribute(ATTR_NAME);
@@ -345,7 +343,7 @@ public class SAML2ScopedStringAttributeTranscoderTest extends OpenSAMLInitBaseTe
     
     @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/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
index 4d157cf26..129945152 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2StringAttributeTranscoderTest.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.saml.attribute.transcoding.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -93,7 +92,7 @@ public class SAML2StringAttributeTranscoderTest extends OpenSAMLInitBaseTestCase
         final SAML2StringAttributeTranscoder transcoder = new SAML2StringAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
diff --git a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
index 2cd3d7f39..5e6511bba 100644
--- a/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
+++ b/shib-saml-attribute-impl/src/test/java/net/shibboleth/idp/saml/attribute/transcoding/impl/SAML2XMLObjectAttributeTranscoderTest.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.saml.attribute.transcoding.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -99,7 +98,7 @@ public class SAML2XMLObjectAttributeTranscoderTest extends OpenSAMLInitBaseTestC
         final SAML2XMLObjectAttributeTranscoder transcoder = new SAML2XMLObjectAttributeTranscoder();
         transcoder.initialize();
         
-        registry.setNamingRegistry(Collections.singletonList(
+        registry.setNamingRegistry(CollectionSupport.singletonList(
                 new BasicNamingFunction<>(transcoder.getEncodedType(), new AbstractSAML2AttributeTranscoder.NamingFunction())));
         
         final Map<String,Object> ruleset1 = new HashMap<>();
@@ -442,7 +441,7 @@ public class SAML2XMLObjectAttributeTranscoderTest extends OpenSAMLInitBaseTestC
     @Nullable private static XMLObjectAttributeValue objectFor(@Nonnull final String value) {
         
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
-        inputAttribute.setValues(Collections.singletonList(new StringAttributeValue(value)));
+        inputAttribute.setValues(CollectionSupport.singletonList(new StringAttributeValue(value)));
         final XMLObject obj = SAMLEncoderSupport.encodeStringValue(inputAttribute, new QName("Foo"), value, true);
         assert obj != null;
         return new XMLObjectAttributeValue(obj);

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


More information about the commits mailing list