[java-opensaml] 01/06: OSJ-353 - Move IdP Spring support for credentials/trust into new module

Scott Cantor cantor.2 at osu.edu
Tue Jul 5 14:26:56 UTC 2022


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

scantor pushed a commit to branch dev/OSJ-353
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=72be7c2e366f942f730e1e9d6b1b34a5eadf1885

commit 72be7c2e366f942f730e1e9d6b1b34a5eadf1885
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Jun 8 10:45:59 2022 -0400

    OSJ-353 - Move IdP Spring support for credentials/trust into new module
    
    https://shibboleth.atlassian.net/browse/OSJ-353
---
 opensaml-parent/pom.xml                            |    2 +
 opensaml-spring/.checkstyle                        |   15 +
 opensaml-spring/.classpath                         |   39 +
 opensaml-spring/.gitignore                         |    1 +
 opensaml-spring/.project                           |   29 +
 .../.settings/org.eclipse.core.resources.prefs     |    6 +
 .../.settings/org.eclipse.jdt.core.prefs           |  413 ++++++
 opensaml-spring/.settings/org.eclipse.jdt.ui.prefs |   63 +
 .../.settings/org.eclipse.m2e.core.prefs           |    4 +
 opensaml-spring/pom.xml                            |  102 ++
 .../opensaml/spring/SecurityNamespaceHandler.java  |   90 ++
 .../AbstractBasicCredentialFactoryBean.java        |  207 +++
 .../credential/AbstractBasicCredentialParser.java  |  163 +++
 .../credential/AbstractCredentialFactoryBean.java  |  144 ++
 .../credential/AbstractCredentialParser.java       |   94 ++
 .../AbstractX509CredentialFactoryBean.java         |  133 ++
 .../credential/AbstractX509CredentialParser.java   |  141 ++
 .../BasicInlineCredentialFactoryBean.java          |  126 ++
 .../credential/BasicInlineCredentialParser.java    |   37 +
 .../BasicResourceCredentialFactoryBean.java        |  147 ++
 .../credential/BasicResourceCredentialParser.java  |   38 +
 .../credential/BasicX509CredentialFactoryBean.java |  224 +++
 .../X509InlineCredentialFactoryBean.java           |  147 ++
 .../credential/X509InlineCredentialParser.java     |   36 +
 .../credential/X509ResourceCredentialParser.java   |   39 +
 .../opensaml/spring/credential/package-info.java   |   22 +
 .../java/org/opensaml/spring/package-info.java     |   22 +
 ...AbstractBasicPKIXValidationInfoFactoryBean.java |  103 ++
 .../spring/trust/AbstractChainingParser.java       |   61 +
 .../trust/AbstractPKIXValidationInfoParser.java    |   78 +
 .../spring/trust/AbstractStaticPKIXParser.java     |  154 ++
 .../spring/trust/AbstractTrustEngineParser.java    |   44 +
 .../trust/CertPathPKIXValidationOptionsParser.java |   89 ++
 .../org/opensaml/spring/trust/ChainingParser.java  |   37 +
 .../trust/ChainingSignatureTrustEngineFactory.java |   69 +
 .../spring/trust/ChainingTrustEngineFactory.java   |   70 +
 .../trust/PKIXInlineValidationInfoFactoryBean.java |  107 ++
 .../trust/PKIXInlineValidationInfoParser.java      |   42 +
 .../PKIXResourceValidationInfoFactoryBean.java     |  112 ++
 .../trust/PKIXResourceValidationInfoParser.java    |   43 +
 .../spring/trust/PKIXValidationOptionsParser.java  |   76 +
 .../spring/trust/SignatureChainingParser.java      |   38 +
 .../spring/trust/StaticExplicitKeyFactoryBean.java |  140 ++
 .../spring/trust/StaticExplicitKeyParser.java      |   62 +
 .../trust/StaticExplicitKeySignatureParser.java    |   66 +
 .../spring/trust/StaticPKIXFactoryBean.java        |  277 ++++
 .../spring/trust/StaticPKIXSignatureParser.java    |   66 +
 .../trust/StaticPKIXX509CredentialParser.java      |   62 +
 .../org/opensaml/spring/trust/package-info.java    |   22 +
 .../src/main/resources/META-INF/spring.handlers    |    1 +
 .../src/main/resources/META-INF/spring.schemas     |    5 +
 .../main/resources/schema/shibboleth-security.xsd  |  612 ++++++++
 .../spring/AbstractSecurityParserTest.java         |   97 ++
 .../spring/credential/BasicInlineParserTest.java   |   70 +
 .../spring/credential/BasicResourceParserTest.java |   80 ++
 .../BasicX509CredentialFactoryBeanTest.java        |   60 +
 .../credential/X509FilesystemParserTest.java       |   88 ++
 .../spring/credential/X509InlineParserTest.java    |   62 +
 .../spring/trust/ChainingTrustEngineTest.java      |   50 +
 .../org/opensaml/spring/trust/MockTrustEngine.java |   44 +
 .../spring/trust/PKIXFilesystemParserTest.java     |   52 +
 .../spring/trust/PKIXInlineParserTest.java         |   53 +
 .../trust/PKIXValidationOptionsParserTest.java     |   53 +
 .../spring/trust/SignatureChainingParserTest.java  |   56 +
 .../trust/StaticExplicitKeyFactoryBeanTest.java    |   97 ++
 .../spring/trust/StaticExplicitKeyParserTest.java  |   52 +
 .../StaticExplicitKeySignatureParserTest.java      |   52 +
 .../spring/trust/StaticPKIXFactoryBeanTest.java    |  132 ++
 .../trust/StaticPKIXSignatureParserTest.java       |  163 +++
 .../trust/StaticPKIXX509CredentialParserTest.java  |  116 ++
 .../org/opensaml/spring/credential/aes-base64.txt  |    1 +
 .../org/opensaml/spring/credential/aes-binary.data |    1 +
 .../org/opensaml/spring/credential/aes-hex.txt     |    1 +
 .../org/opensaml/spring/credential/bean.xml        |   28 +
 .../org/opensaml/spring/credential/cert.pem        |   22 +
 .../org/opensaml/spring/credential/certificate.pem |   52 +
 .../org/opensaml/spring/credential/crl.pem         |   19 +
 .../org/opensaml/spring/credential/idp-signing.crt |   22 +
 .../org/opensaml/spring/credential/idp-signing.key |   27 +
 .../spring/credential/idp-signing.key.pass         |   30 +
 .../opensaml/spring/credential/inlineCertOnly.xml  |   30 +
 .../spring/credential/inlineKeyCertCrl.xml         |  128 ++
 .../spring/credential/inlinePublicOnly.xml         |   17 +
 .../spring/credential/inlinePublicPrivate.xml      |   48 +
 .../opensaml/spring/credential/inlineWrongCert.xml |   87 ++
 .../org/opensaml/spring/credential/key.pem         |   27 +
 .../org/opensaml/spring/credential/publicKey.pem   |    9 +
 .../opensaml/spring/credential/resourceBasic.xml   |    8 +
 .../credential/resourceCertElementsKeyName.xml     |   10 +
 .../spring/credential/resourceCertOnly.xml         |    8 +
 .../spring/credential/resourceKeyCertCrl.xml       |   11 +
 .../spring/credential/resourcePublicOnly.xml       |    9 +
 .../spring/credential/resourcePublicPrivate.xml    |    9 +
 .../spring/credential/resourceSecretAESBase64.xml  |    9 +
 .../spring/credential/resourceSecretAESBinary.xml  |    9 +
 .../spring/credential/resourceSecretAESHex.xml     |    9 +
 .../opensaml/spring/credential/resourceTwoCert.xml |    8 +
 .../spring/credential/resourceWrongCert.xml        |    9 +
 .../spring/credential/resourceWrongPublic.xml      |    9 +
 .../opensaml/spring/credential/resourceX509.xml    |    8 +
 .../spring/credential/secretKeyAESBase64.xml       |   11 +
 .../opensaml/spring/credential/secretKeyAESHex.xml |   11 +
 .../opensaml/spring/credential/wrongPublicKey.pem  |    6 +
 .../resources/org/opensaml/spring/trust/cert.pem   |   22 +
 .../resources/org/opensaml/spring/trust/chain.xml  |   41 +
 .../org/opensaml/spring/trust/chainingTrue.xml     |   18 +
 .../opensaml/spring/trust/chainingTrueFalse.xml    |   22 +
 .../resources/org/opensaml/spring/trust/crl.pem    |   19 +
 .../opensaml/spring/trust/inlineValidationInfo.xml |    5 +
 .../spring/trust/inlineValidationInfoValues.xml    |   77 +
 .../spring/trust/resourceValidationInfo.xml        |    5 +
 .../spring/trust/resourceValidationInfoValues.xml  |   10 +
 .../static-pkix-factory-custom-failsValidation.xml |   34 +
 .../trust/static-pkix-factory-custom-success.xml   |   30 +
 .../spring/trust/static-pkix-factory-defaults.xml  |   24 +
 .../org/opensaml/spring/trust/staticExplicit.xml   |   30 +
 .../opensaml/spring/trust/staticExplicitNative.xml |   28 +
 .../spring/trust/staticExplicitSignature.xml       |   30 +
 .../spring/trust/staticPKIX-nameCheckDisabled.xml  |    8 +
 .../org/opensaml/spring/trust/staticPKIX.xml       |    8 +
 .../staticPKIXCredentials-nameCheckDisabled.xml    |   18 +
 .../spring/trust/staticPKIXCredentials.xml         |   19 +
 .../org/opensaml/spring/trust/staticPKIXValues.xml |   16 +
 .../spring/trust/staticPKIXValuesCertPathOpts.xml  |   19 +
 .../opensaml/spring/trust/validationOptions.xml    |    5 +
 .../spring/trust/validationOptionsValues.xml       |    7 +
 .../test-output/Default suite/Default test.html    |  875 +++++++++++
 .../test-output/Default suite/Default test.xml     |   89 ++
 .../test-output/Default suite/testng-failed.xml    |   15 +
 opensaml-spring/test-output/bullet_point.png       |  Bin 0 -> 356 bytes
 opensaml-spring/test-output/collapseall.gif        |  Bin 0 -> 157 bytes
 opensaml-spring/test-output/emailable-report.html  |  348 +++++
 opensaml-spring/test-output/failed.png             |  Bin 0 -> 977 bytes
 opensaml-spring/test-output/index.html             | 1515 ++++++++++++++++++++
 opensaml-spring/test-output/jquery.min.js          |    2 +
 ...aml.spring.credential.BasicInlineParserTest.xml |   12 +
 ...l.spring.credential.BasicResourceParserTest.xml |   16 +
 ...edential.BasicX509CredentialFactoryBeanTest.xml |    6 +
 ....spring.credential.X509FilesystemParserTest.xml |   14 +
 ...saml.spring.credential.X509InlineParserTest.xml |   10 +
 ...ensaml.spring.trust.ChainingTrustEngineTest.xml |    8 +
 ...nsaml.spring.trust.PKIXFilesystemParserTest.xml |    8 +
 ....opensaml.spring.trust.PKIXInlineParserTest.xml |    8 +
 ...pring.trust.PKIXValidationOptionsParserTest.xml |    8 +
 ...ml.spring.trust.SignatureChainingParserTest.xml |    6 +
 ...ring.trust.StaticExplicitKeyFactoryBeanTest.xml |   12 +
 ...ml.spring.trust.StaticExplicitKeyParserTest.xml |    6 +
 ....trust.StaticExplicitKeySignatureParserTest.xml |    6 +
 ...saml.spring.trust.StaticPKIXFactoryBeanTest.xml |   10 +
 ....spring.trust.StaticPKIXSignatureParserTest.xml |   12 +
 ...ng.trust.StaticPKIXX509CredentialParserTest.xml |    8 +
 opensaml-spring/test-output/navigator-bullet.png   |  Bin 0 -> 352 bytes
 .../old/Default suite/Default test.properties      |    1 +
 .../test-output/old/Default suite/classes.html     |  522 +++++++
 .../test-output/old/Default suite/groups.html      |    1 +
 .../test-output/old/Default suite/index.html       |    6 +
 .../test-output/old/Default suite/main.html        |    2 +
 .../old/Default suite/methods-alphabetical.html    |  170 +++
 .../old/Default suite/methods-not-run.html         |   16 +
 .../test-output/old/Default suite/methods.html     |  170 +++
 .../old/Default suite/reporter-output.html         |    1 +
 .../test-output/old/Default suite/testng.xml.html  |    1 +
 .../test-output/old/Default suite/toc.html         |   30 +
 opensaml-spring/test-output/old/index.html         |    9 +
 opensaml-spring/test-output/passed.png             |  Bin 0 -> 1019 bytes
 opensaml-spring/test-output/skipped.png            |  Bin 0 -> 967 bytes
 opensaml-spring/test-output/testng-failed.xml      |   15 +
 opensaml-spring/test-output/testng-reports.css     |  326 +++++
 opensaml-spring/test-output/testng-reports.js      |  122 ++
 opensaml-spring/test-output/testng-reports1.css    |  344 +++++
 opensaml-spring/test-output/testng-reports2.js     |   76 +
 opensaml-spring/test-output/testng-results.xml     |  703 +++++++++
 opensaml-spring/test-output/testng.css             |    9 +
 173 files changed, 13003 insertions(+)

diff --git a/opensaml-parent/pom.xml b/opensaml-parent/pom.xml
index 741bcfe3c..a6549679f 100644
--- a/opensaml-parent/pom.xml
+++ b/opensaml-parent/pom.xml
@@ -47,6 +47,8 @@
         <module>../opensaml-xacml-saml-impl</module>
         <module>../opensaml-profile-api</module>
         <module>../opensaml-profile-impl</module>
+        
+        <module>../opensaml-spring</module>
 
         <module>../opensaml-bom</module>
         <module>../opensaml-tests-bom</module>
diff --git a/opensaml-spring/.checkstyle b/opensaml-spring/.checkstyle
new file mode 100644
index 000000000..c04bf97d7
--- /dev/null
+++ b/opensaml-spring/.checkstyle
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fileset-config file-format-version="1.2.0" simple-config="false" sync-formatter="false">
+
+  <local-check-config name="Shibboleth Checkstyle" location="/opensaml-parent/resources/checkstyle/checkstyle.xml" type="project" description="">
+    <additional-data name="cache-file" value="true"/>
+    <additional-data name="cache-props-file-location" value="null_1312636288299_cache.properties"/>
+    <additional-data name="cache-file-location" value="null_1312636288299_cache.xml"/>
+  </local-check-config>
+ 
+  <fileset name="main source" enabled="true" check-config-name="Shibboleth Checkstyle" local="true">
+    <file-match-pattern match-pattern="src/main/java/.*\.java$" include-pattern="true"/>
+  </fileset>
+  
+</fileset-config>
diff --git a/opensaml-spring/.classpath b/opensaml-spring/.classpath
new file mode 100644
index 000000000..6fc81d614
--- /dev/null
+++ b/opensaml-spring/.classpath
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="test" value="true"/>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="test" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
+		<attributes>
+			<attribute name="module" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/opensaml-spring/.gitignore b/opensaml-spring/.gitignore
new file mode 100644
index 000000000..b83d22266
--- /dev/null
+++ b/opensaml-spring/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/opensaml-spring/.project b/opensaml-spring/.project
new file mode 100644
index 000000000..939c09743
--- /dev/null
+++ b/opensaml-spring/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>opensaml-spring</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/opensaml-spring/.settings/org.eclipse.core.resources.prefs b/opensaml-spring/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..29abf9995
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
diff --git a/opensaml-spring/.settings/org.eclipse.jdt.core.prefs b/opensaml-spring/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..7dda60bd3
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,413 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.mainOnlyProjectHasTestOnlyDependency=error
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=info
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=info
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=1
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs b/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..86c79c4bc
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+cleanup.add_default_serial_version_id=false
+cleanup.add_generated_serial_version_id=true
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=false
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=true
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=true
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=_Shibboleth
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Shibboleth
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=false
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Commen [...]
diff --git a/opensaml-spring/.settings/org.eclipse.m2e.core.prefs b/opensaml-spring/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 000000000..f897a7f1c
--- /dev/null
+++ b/opensaml-spring/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/opensaml-spring/pom.xml b/opensaml-spring/pom.xml
new file mode 100644
index 000000000..3b71e1f74
--- /dev/null
+++ b/opensaml-spring/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.opensaml</groupId>
+        <artifactId>opensaml-parent</artifactId>
+        <version>5.0.0-SNAPSHOT</version>
+        <relativePath>../opensaml-parent</relativePath>
+    </parent>
+
+    <name>OpenSAML :: Spring Support</name>
+    <description>Spring Support</description>
+    <artifactId>opensaml-spring</artifactId>
+    <packaging>jar</packaging>
+
+    <properties>
+        <automatic.module.name>org.opensaml.spring</automatic.module.name>
+    </properties>
+
+    <dependencies>
+        <!-- Compile Dependencies -->
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>opensaml-security-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>opensaml-security-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>opensaml-xmlsec-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.shibboleth.ext</groupId>
+            <artifactId>spring-extensions</artifactId>
+            <!-- Exception to usual test scope. -->
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+
+        <!-- Provided Dependencies -->
+
+        <!-- Runtime Dependencies -->
+
+        <!-- Test Dependencies -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+    
+    <scm>
+        <connection>${shibboleth.scm.connection}java-opensaml</connection>
+        <developerConnection>${shibboleth.scm.developerConnection}java-opensaml</developerConnection>
+        <url>${shibboleth.scm.url}java-opensaml.git</url>
+    </scm>
+
+    <distributionManagement>
+        <site>
+            <id>site</id>
+            <url>scp:${opensaml-module.site.url}</url>
+        </site>
+    </distributionManagement>
+
+
+</project>
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java b/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java
new file mode 100644
index 000000000..0660bd541
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/SecurityNamespaceHandler.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.credential.BasicInlineCredentialParser;
+import org.opensaml.spring.credential.BasicResourceCredentialParser;
+import org.opensaml.spring.credential.X509InlineCredentialParser;
+import org.opensaml.spring.credential.X509ResourceCredentialParser;
+import org.opensaml.spring.trust.CertPathPKIXValidationOptionsParser;
+import org.opensaml.spring.trust.ChainingParser;
+import org.opensaml.spring.trust.PKIXInlineValidationInfoParser;
+import org.opensaml.spring.trust.PKIXResourceValidationInfoParser;
+import org.opensaml.spring.trust.PKIXValidationOptionsParser;
+import org.opensaml.spring.trust.SignatureChainingParser;
+import org.opensaml.spring.trust.StaticExplicitKeyParser;
+import org.opensaml.spring.trust.StaticExplicitKeySignatureParser;
+import org.opensaml.spring.trust.StaticPKIXSignatureParser;
+import org.opensaml.spring.trust.StaticPKIXX509CredentialParser;
+
+import net.shibboleth.ext.spring.util.BaseSpringNamespaceHandler;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+
+/** Namespace handler for {@link #SECURITY_NAMESPACE}. */
+public class SecurityNamespaceHandler extends BaseSpringNamespaceHandler {
+
+    /** Namespace for Security. */
+    @Nonnull @NotEmpty public static final String SECURITY_NAMESPACE = "urn:mace:shibboleth:2.0:security";
+
+    /** Credential element name. */
+    @Nonnull public static final QName CREDENTIAL_ELEMENT_NAME = new QName(SECURITY_NAMESPACE, "Credential");
+
+    /** TrustEngine Element name. */
+    @Nonnull public static final QName TRUST_ENGINE_ELEMENT_NAME = new QName(SECURITY_NAMESPACE, "TrustEngine");
+
+    /** TrustEngineRef element name. */
+    @Nonnull public static final QName TRUST_ENGINE_REF = new QName(SECURITY_NAMESPACE, "TrustEngineRef");
+
+    /** {@inheritDoc} */
+    @Override public void init() {
+        // Credentials
+        registerBeanDefinitionParser(X509ResourceCredentialParser.TYPE_NAME_RESOURCE,
+                new X509ResourceCredentialParser());
+        registerBeanDefinitionParser(X509InlineCredentialParser.TYPE_NAME, new X509InlineCredentialParser());
+        registerBeanDefinitionParser(BasicInlineCredentialParser.TYPE_NAME, new BasicInlineCredentialParser());
+        registerBeanDefinitionParser(BasicResourceCredentialParser.TYPE_NAME_RESOURCE,
+                new BasicResourceCredentialParser());
+
+        registerBeanDefinitionParser(StaticExplicitKeySignatureParser.TYPE_NAME, 
+                new StaticExplicitKeySignatureParser());
+        registerBeanDefinitionParser(StaticPKIXSignatureParser.TYPE_NAME, new StaticPKIXSignatureParser());
+        registerBeanDefinitionParser(SignatureChainingParser.TYPE_NAME, new SignatureChainingParser());
+
+        // Validation Info
+        registerBeanDefinitionParser(PKIXResourceValidationInfoParser.TYPE_NAME_RESOURCE,
+                new PKIXResourceValidationInfoParser());
+        registerBeanDefinitionParser(PKIXInlineValidationInfoParser.SCHEMA_TYPE, new PKIXInlineValidationInfoParser());
+
+        // Validation Opts
+        registerBeanDefinitionParser(PKIXValidationOptionsParser.ELEMENT_NAME, new PKIXValidationOptionsParser());
+        registerBeanDefinitionParser(CertPathPKIXValidationOptionsParser.ELEMENT_NAME,
+                new CertPathPKIXValidationOptionsParser());
+
+        //
+        // Trust Engines needed for the HttpMetadataProvider
+        //
+        registerBeanDefinitionParser(ChainingParser.TYPE_NAME, new ChainingParser());
+        registerBeanDefinitionParser(StaticExplicitKeyParser.TYPE_NAME, new StaticExplicitKeyParser());
+        registerBeanDefinitionParser(StaticPKIXX509CredentialParser.TYPE_NAME, new StaticPKIXX509CredentialParser());
+
+    }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java
new file mode 100644
index 000000000..dd7ffe6a8
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialFactoryBean.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.UnsupportedEncodingException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.util.encoders.Hex;
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.crypto.KeySupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * A factory bean to collect information to do with a {@link BasicCredential}.
+ */
+public abstract class AbstractBasicCredentialFactoryBean extends AbstractCredentialFactoryBean<BasicCredential> {
+    
+    /** Form of encoding for SecretKey info. */
+    public enum SecretKeyEncoding {
+       /** Raw binary encoding. */
+       binary,
+       /** Hexidecimal encoding. */
+       hex,
+       /** Base64 encoding. */
+       base64
+    }
+    
+    /** Log. */
+    private final Logger log = LoggerFactory.getLogger(AbstractBasicCredentialFactoryBean.class);
+
+    /** The SecretKey algorithm. */
+    @Nullable private String secretKeyAlgorithm;
+    
+    /** The SecretKey encoding used. */
+    @Nullable private SecretKeyEncoding secretKeyEncoding = SecretKeyEncoding.base64;
+    
+    /**
+     * Decode the SecretKey data, based on the specified encoding.
+     * 
+     * @param data the Secret key data
+     * @return the decoded SecretKey byte array
+     */
+    protected byte[] decodeSecretKey(final String data) {
+        Constraint.isNotNull(data, "SecretKey data was null");
+        switch (getSecretKeyEncoding()) {
+            case binary:
+                // This sort of doesn't make sense for the String input, but just assume it's UTF-8
+                try {
+                    return data.getBytes("UTF-8");
+                } catch (final UnsupportedEncodingException e) {
+                    // Can't actually happen, UTF-8 always supported.
+                    return null;
+                }
+            case hex:
+                return Hex.decode(data);
+            case base64:
+                return Base64.decodeBase64(data);
+            default:
+                throw new IllegalArgumentException("Saw unsupported encoding: " + getSecretKeyEncoding());
+            
+        }
+    }
+
+    /**
+     * Decode the SecretKey data, based on the specified encoding.
+     * 
+     * @param data the Secret key data
+     * @return the decoded SecretKey byte array
+     */
+    protected byte[] decodeSecretKey(final byte[] data) {
+        Constraint.isNotNull(data, "SecretKey data was null");
+        switch (getSecretKeyEncoding()) {
+            case binary:
+                return data;
+            case hex:
+                return Hex.decode(data);
+            case base64:
+                return Base64.decodeBase64(data);
+            default:
+                throw new IllegalArgumentException("Saw unsupported encoding: " + getSecretKeyEncoding());
+            
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected BasicCredential doCreateInstance() throws Exception {
+
+        final PrivateKey privateKey = getPrivateKey();
+        final PublicKey publicKey = getPublicKey();
+        final SecretKey secretKey = getSecretKey();
+        final BasicCredential credential;
+        
+        // Asymmetric credential
+        if (null != publicKey) {
+            if (null == privateKey) {
+                credential = new BasicCredential(publicKey);
+            } else {
+                if (!KeySupport.matchKeyPair(publicKey, privateKey)) {
+                    log.error("{}: Public and private keys do not match", getConfigDescription());
+                    throw new BeanCreationException("Public and private keys do not match");
+                }
+                credential = new BasicCredential(publicKey, privateKey);
+            }
+        // Symmetric credential
+        } else if (null != secretKey) {
+            credential = new BasicCredential(secretKey);
+        } else {
+            throw new BeanCreationException("Neither public key nor secret key specified");
+        }
+        
+        if (null != getUsageType()) {
+            credential.setUsageType(UsageType.valueOf(getUsageType()));
+        }
+        return credential;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Class<?> getObjectType() {
+        return BasicCredential.class;
+    }
+    
+    /**
+     * Get the algorithm for the SecretKey.
+     * 
+     * @return Returns the SecretKey algorithm
+     */
+    @Nullable public String getSecretKeyAlgorithm() {
+        return secretKeyAlgorithm;
+    }
+
+    /**
+     * Set the algorithm for the SecretKey.
+     * 
+     * @param algorithm The algorithm to set.
+     */
+    public void setSecretKeyAlgorithm(@Nonnull final String algorithm) {
+        secretKeyAlgorithm = Constraint.isNotNull(StringSupport.trimOrNull(algorithm), 
+                "SecretKey algorithm may not be null");
+    }
+
+    /**
+     * Get the SecretKey encoding. Defaults to: base64.
+     * 
+     * @return the encoding
+     */
+    public SecretKeyEncoding getSecretKeyEncoding() {
+        return secretKeyEncoding;
+    }
+
+    /**
+     * Set the SecretKey encoding. Defaults to: base64
+     * 
+     * @param encoding the new encoding
+     */
+    public void setSecretKeyEncoding(@Nonnull final SecretKeyEncoding encoding) {
+        secretKeyEncoding = Constraint.isNotNull(encoding, "SecretKey encoding may not be null");
+    }
+
+    /**
+     * return the configured Public Key. 
+     * 
+     * @return the key, or none if not configured.
+     */
+    @Nullable protected abstract PublicKey getPublicKey();
+
+    /**
+     * Get the configured Private key.
+     * 
+     * @return the key or null if non configured
+     */
+    @Nullable protected abstract PrivateKey getPrivateKey();
+
+    /**
+     * return the configured Secret Key. 
+     * 
+     * @return the key, or none if not configured.
+     */
+    @Nullable protected abstract SecretKey getSecretKey();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java
new file mode 100644
index 000000000..39c58aacb
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractBasicCredentialParser.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Specific parser for all BasicCredentials.
+ * 
+ * <p>
+ * This does the work of putting the element values into strings. The bean factory then does the correct thing - with
+ * some help from Spring doing auto-conversion.
+ * </p>
+ */
+public abstract class AbstractBasicCredentialParser extends AbstractCredentialParser {
+
+    /** <PrivateKey>. */
+    public static final QName PRIVATE_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "PrivateKey");
+
+    /** <PublicKey>. */
+    public static final QName PUBLIC_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "PublicKey");
+
+    /** <SecretKey>. */
+    public static final QName SECRET_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "SecretKey");
+
+    /** log. */
+    private final Logger log = LoggerFactory.getLogger(AbstractBasicCredentialParser.class);
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+        builder.addPropertyValue("configDescription", parserContext.getReaderContext().getResource().getDescription());
+
+        parsePrivateKey(ElementSupport.getChildElements(element, PRIVATE_KEY_ELEMENT_NAME), parserContext, builder);
+        parsePublicKey(ElementSupport.getChildElements(element, PUBLIC_KEY_ELEMENT_NAME), parserContext, builder);
+        parseSecretKey(ElementSupport.getChildElements(element, SECRET_KEY_ELEMENT_NAME), parserContext, builder);
+    }
+
+    /**
+     * Parse the <PrivateKey> element.
+     * 
+     * @param childElements the elements containing the private key, may be null or empty.
+     * @param parserContext used for logging.
+     * @param builder the builder.
+     */
+    private void parsePrivateKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+            @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            return;
+        }
+        if (childElements.size() > 1) {
+            log.error("{}: More than one <PrivateKey> Elements present.", parserContext.getReaderContext()
+                    .getResource().getDescription());
+            throw new BeanCreationException("More than one <PrivateKey> Elements present.");
+        }
+        final Element key = childElements.get(0);
+        final String value = StringSupport.trimOrNull(key.getTextContent());
+        if (null == value) {
+            log.error("{}: <PrivateKey> Must contain text.", parserContext.getReaderContext().getResource()
+                    .getDescription());
+            throw new BeanCreationException("<PrivateKey> Must contain text.");
+        }
+        log.debug("Found a private key <Supressed>");
+        builder.addPropertyValue("privateKeyInfo", value);
+        builder.addPropertyValue("privateKeyPassword", key.getAttributeNS(null, "password"));
+    }
+
+    /**
+     * Parse the <PublicKey> elements.
+     * 
+     * @param childElements the elements containing the public key, must have exactly one element
+     * @param parserContext used for logging.
+     * @param builder the builder
+     */
+    private void parsePublicKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+            @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            return;
+        }
+        if (childElements.size() > 1) {
+            log.error("{}: More than one <PublicKey> elements present.", parserContext.getReaderContext().getResource()
+                    .getDescription());
+            throw new BeanCreationException("More than one <PublicKey> elements present.");
+        }
+        final Element key = childElements.get(0);
+        final String value = StringSupport.trimOrNull(key.getTextContent());
+        if (null == value) {
+            log.error("{}: <PublicKey> Must contain text.", parserContext.getReaderContext().getResource()
+                    .getDescription());
+            throw new BeanCreationException("<PublicKey> Must contain text.");
+        }
+        log.debug("Found a public key {}", value);
+        builder.addPropertyValue("publicKeyInfo", value);
+
+        if (key.hasAttributeNS(null, "password")) {
+            log.warn("password on public key is ignored");
+        }
+    }
+
+    /**
+     * Parse the <SecretKey> element.
+     * 
+     * @param childElements the elements containing the private key, may be null or empty.
+     * @param parserContext used for logging.
+     * @param builder the builder
+     */
+    private void parseSecretKey(@Nullable final List<Element> childElements, final ParserContext parserContext,
+            @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            return;
+        }
+        if (childElements.size() > 1) {
+            log.error("{}: More than one <SecretKey> Elements present.", parserContext.getReaderContext().getResource()
+                    .getDescription());
+            throw new BeanCreationException("More than one <SecretKey> Elements present.");
+        }
+        final Element key = childElements.get(0);
+        final String value = StringSupport.trimOrNull(key.getTextContent());
+        if (null == value) {
+            log.error("{}: <SecretKey> Must contain text.", parserContext.getReaderContext().getResource()
+                    .getDescription());
+            throw new BeanCreationException("<SecretKey> Must contain text.");
+        }
+        log.debug("Found a secret key <Supressed>");
+        builder.addPropertyValue("secretKeyInfo", value);
+        builder.addPropertyValue("secretKeyAlgorithm", StringSupport.trimOrNull(key.getAttributeNS(null, "algorithm")));
+        builder.addPropertyValue("secretKeyEncoding", StringSupport.trimOrNull(key.getAttributeNS(null, "encoding")));
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java
new file mode 100644
index 000000000..82a895110
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialFactoryBean.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.security.credential.Credential;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+
+/**
+ * A factory bean to accumulate the information pertaining to an
+ * {@link org.opensaml.security.credential.AbstractCredential}.
+ * @param <T> the type of credential to create.
+ */
+public abstract class AbstractCredentialFactoryBean<T extends Credential> extends AbstractComponentAwareFactoryBean<T> {
+
+    /** Usage type of the credential. */
+    private String usageType;
+
+    /** Names for the key represented by the credential. */
+    private List<String> keyNames;
+
+    /** Identifier for the owner of the credential. */
+    private String entityID;
+    
+    /** The privateKey Password (if any). */
+    @Nullable private char[] privateKeyPassword;
+
+    /** For logging: The description of the source of the configuration.*/
+    @Nonnull private String configDescription;
+   
+    /**
+     * Gets the names for the key represented by the credential.
+     * 
+     * @return names for the key represented by the credential
+     */
+    @Nullable public List<String> getKeyNames() {
+        return keyNames;
+    }
+
+    /**
+     * Gets the usage type of the credential.
+     * 
+     * @return usage type of the credential
+     */
+    @Nullable public String getUsageType() {
+        return usageType;
+    }
+
+    /**
+     * Get the entity ID of the credential.
+     * 
+     * @return the entity ID
+     */
+    @Nullable public String getEntityID() {
+        return entityID;
+    }
+
+    /**
+     * Sets the names for the key represented by the credential.
+     * 
+     * @param names names for the key represented by the credential
+     */
+    public void setKeyNames(@Nullable final List<String> names) {
+        keyNames = names;
+    }
+
+    /**
+     * Sets the usage type of the credential.
+     * 
+     * @param type usage type of the credential
+     */
+    public void setUsageType(@Nullable final String type) {
+        if (null != type) {
+            usageType = type.toUpperCase();
+        } else {
+            usageType = type;
+        }
+    }
+
+    /**
+     * Set the entity ID of the credential.
+     * 
+     * @param newEntityID the entity ID
+     */
+    public void setEntityID(@Nullable final String newEntityID) {
+        entityID = newEntityID;
+    }
+    
+    /**
+     * Get the password for the private key.
+     * 
+     * @return Returns the privateKeyPassword.
+     */
+    @Nullable public char[] getPrivateKeyPassword() {
+        return privateKeyPassword;
+    }
+
+    /**
+     * Set the password for the private key.
+     * 
+     * @param password The password to set.
+     */
+    public void setPrivateKeyPassword(@Nullable final char[] password) {
+        if (null != password && password.length > 0) {
+            privateKeyPassword = password;
+        } else {
+            privateKeyPassword = null;
+        }
+    }
+
+    /** For logging, get the description of the resource that defined this bean.
+     * @return Returns the description.
+     */
+    public String getConfigDescription() {
+        return configDescription;
+    }
+
+    /** For logging, set the description of the resource that defined this bean.
+     * @param desc what to set.
+     */
+    public void setConfigDescription(@Nonnull final String desc) {
+        configDescription = desc;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java
new file mode 100644
index 000000000..1fb81037c
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractCredentialParser.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+/**
+ * Base parser for all <Credential> elements.
+ */
+public abstract class AbstractCredentialParser extends AbstractCustomBeanDefinitionParser {
+
+    /** <Credential>. */
+    public static final QName CREDENTIAL_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "Credential");
+
+    /** <KeyName>. */
+    public static final QName KEY_NAME_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "KeyName");
+
+    /** {@inheritDoc} */
+    @Override protected String resolveId(final Element element, final AbstractBeanDefinition definition,
+            final ParserContext parserContext) {
+        return StringSupport.trimOrNull(element.getAttributeNS(null, "id"));
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+        
+        builder.setLazyInit(true);
+
+        parseAttributes(element, builder);
+        parseKeyNames(ElementSupport.getChildElements(element, KEY_NAME_ELEMENT_NAME), builder);
+    }
+
+    /**
+     * Parse the credential element attributes.
+     * 
+     * @param element credential element
+     * @param builder bean definition builder
+     */
+    protected void parseAttributes(final Element element, final BeanDefinitionBuilder builder) {
+        final String usage = StringSupport.trimOrNull(element.getAttributeNS(null, "usage"));
+        builder.addPropertyValue("usageType", usage);
+
+        final String entityID = StringSupport.trimOrNull(element.getAttributeNS(null, "entityID"));
+        if (entityID != null) {
+            builder.addPropertyValue("entityID", entityID);
+        }
+    }
+
+    /**
+     * Parses the key names from the credential configuration.
+     * 
+     * @param keyNameElems the elements to parse
+     * @param builder credential build
+     */
+    protected void parseKeyNames(final List<Element> keyNameElems, final BeanDefinitionBuilder builder) {
+        if (keyNameElems == null || keyNameElems.isEmpty()) {
+            return;
+        }
+
+        builder.addPropertyValue("keyNames", SpringSupport.getElementTextContentAsManagedList(keyNameElems));
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java
new file mode 100644
index 000000000..786361dd6
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialFactoryBean.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.PrivateKey;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.crypto.KeySupport;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * A factory bean to collect information to do with an X509 backed {@link BasicX509Credential}.
+ */
+public abstract class AbstractX509CredentialFactoryBean extends AbstractCredentialFactoryBean<BasicX509Credential> {
+
+    /** Log. */
+    private final Logger log = LoggerFactory.getLogger(AbstractX509CredentialFactoryBean.class);
+
+    /** {@inheritDoc} */
+    // Checkstyle: CyclomaticComplexity OFF
+    @Override protected BasicX509Credential doCreateInstance() throws Exception {
+
+        final List<X509Certificate> certificates = getCertificates();
+        if (null == certificates || certificates.isEmpty()) {
+            log.error("{}: No Certificates provided", getConfigDescription());
+            throw new BeanCreationException("No Certificates provided");
+        }
+
+        X509Certificate entityCertificate = getEntityCertificate();
+        if (null == entityCertificate) {
+            entityCertificate = certificates.get(0);
+        }
+
+        final PrivateKey privateKey = getPrivateKey();
+
+        final BasicX509Credential credential;
+        if (null == privateKey) {
+            credential = new BasicX509Credential(entityCertificate);
+        } else {
+            credential = new BasicX509Credential(entityCertificate, privateKey);
+
+            if (!KeySupport.matchKeyPair(entityCertificate.getPublicKey(), privateKey)) {
+                log.error("{}: Public and private keys do not match", getConfigDescription());
+                throw new BeanCreationException("Public and private keys do not match");
+            }
+        }
+
+        credential.setEntityCertificateChain(certificates);
+
+        final List<X509CRL> crls = getCRLs();
+        if (null != crls && !crls.isEmpty()) {
+            credential.setCRLs(crls);
+        }
+
+        if (null != getUsageType()) {
+            credential.setUsageType(UsageType.valueOf(getUsageType()));
+        }
+
+        if (null != getEntityID()) {
+            credential.setEntityId(getEntityID());
+        }
+
+        final List<String> keyNames = getKeyNames();
+        if (null != keyNames) {
+            credential.getKeyNames().addAll(keyNames);
+        }
+
+        return credential;
+    }
+
+    // Checkstyle: CyclomaticComplexity ON
+
+    /** {@inheritDoc} */
+    @Override public Class<BasicX509Credential> getObjectType() {
+        return BasicX509Credential.class;
+    }
+
+    /**
+     * return the explicitly configured entity certificate.
+     * 
+     * @return the certificate, or none if not configured.
+     */
+    @Nullable protected abstract X509Certificate getEntityCertificate();
+
+    /**
+     * Get the configured certificates. This <strong>MUST</strong> include the entity certificate if it was configured.
+     * 
+     * @return the certificates.
+     */
+
+    @Nonnull @NotEmpty protected abstract List<X509Certificate> getCertificates();
+
+    /**
+     * Get the configured private key.
+     * 
+     * @return the key or null if non configured
+     */
+    @Nullable protected abstract PrivateKey getPrivateKey();
+
+    /**
+     * Get the configured CRL list.
+     * 
+     * @return the crls or null
+     */
+    @Nullable protected abstract List<X509CRL> getCRLs();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java
new file mode 100644
index 000000000..1d5f3c949
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/AbstractX509CredentialParser.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.AttributeSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.w3c.dom.Element;
+
+/**
+ * Specific parser for all X509Credentials.
+ * 
+ * <p>
+ * This does the work of putting the element values into strings. The bean factory then does the correct thing - with
+ * some help from Spring doing auto-conversion.
+ * </p>
+ */
+public abstract class AbstractX509CredentialParser extends AbstractCredentialParser {
+
+    /** <PrivateKey>. */
+    public static final QName PRIVATE_KEY_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "PrivateKey");
+
+    /** <Certificate>. */
+    public static final QName CERTIFICATE_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "Certificate");
+
+    /** <CRL>. */
+    public static final QName CRL_ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "CRL");
+
+    /** log. */
+    private Logger log = LoggerFactory.getLogger(AbstractX509CredentialParser.class);
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final BeanDefinitionBuilder builder) {
+        super.doParse(element, builder);
+        parsePrivateKey(ElementSupport.getChildElements(element, PRIVATE_KEY_ELEMENT_NAME), builder);
+        parseCertificates(ElementSupport.getChildElements(element, CERTIFICATE_ELEMENT_NAME), builder);
+        parseCRLs(ElementSupport.getChildElements(element, CRL_ELEMENT_NAME), builder);
+    }
+
+    /**
+     * Parse the <PrivateKey> element.
+     * 
+     * @param childElements the elements containing the private key, may be null or empty.
+     * @param builder the builder
+     */
+    private void parsePrivateKey(@Nullable final List<Element> childElements,
+            @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            return;
+        }
+        if (childElements.size() > 1) {
+            throw new BeanCreationException("More than one <PrivateKey> Elements present.");
+        }
+        final Element key = childElements.get(0);
+        final String value = StringSupport.trimOrNull(key.getTextContent());
+        if (null == value) {
+            throw new BeanCreationException("<PrivateKey> Must contain text.");
+        }
+        log.debug("Found a private key <Supressed>");
+        builder.addPropertyValue("privateKey", value);
+        builder.addPropertyValue("privateKeyPassword", key.getAttributeNS(null, "password"));
+    }
+
+    /**
+     * Parse the <Certificate> elements.
+     * 
+     * @param childElements the elements containing the certificates, Must have at least one element.
+     * @param builder the builder
+     */
+    private void parseCertificates(@Nullable final List<Element> childElements,
+            @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            throw new BeanCreationException("At least one <Certificate> should be present.");
+        }
+
+        final List<String> certs = new ManagedList<>(childElements.size());
+
+        for (final Element elem : childElements) {
+            final String cert = StringSupport.trimOrNull(elem.getTextContent());
+            if (null == cert) {
+                throw new BeanCreationException("All <Certificate> elements must contain text.");
+            }
+            if (elem.hasAttributeNS(null, "entityCertificate")
+                    && AttributeSupport.getAttributeValueAsBoolean(elem.getAttributeNodeNS(null,
+                            "entityCertificate"))) {
+                // Note the loss of property replacement for this undocumented extension
+                log.debug("Found a certficate marked as an entityCertificate {}", cert);
+                builder.addPropertyValue("entity", cert);
+            } else {
+                log.debug("Found a certficate {}", cert);
+            }
+            certs.add(cert);
+        }
+        builder.addPropertyValue("certificates", certs);
+    }
+
+    /**
+     * Parse the <CRL> elements.
+     * 
+     * @param childElements the elements containing the CRLs, Must have at least one element.
+     * @param builder the builder
+     */
+    private void parseCRLs(@Nullable final List<Element> childElements, @Nonnull final BeanDefinitionBuilder builder) {
+        if (null == childElements || childElements.isEmpty()) {
+            return;
+        }
+
+        builder.addPropertyValue("CRLs", SpringSupport.getElementTextContentAsManagedList(childElements));
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java
new file mode 100644
index 000000000..bac2aebc0
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialFactoryBean.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.crypto.KeySupport;
+import org.springframework.beans.factory.BeanCreationException;
+
+/**
+ * Factory bean for BasicInline Credentials. 
+ */
+public class BasicInlineCredentialFactoryBean extends AbstractBasicCredentialFactoryBean {
+
+    /** Configured public key Info. */
+    @Nullable private byte[] publicKeyInfo;
+
+    /** Configured private key Info. */
+    @Nullable private byte[] privateKeyInfo;
+
+    /** Configured secret key Info. */
+    @Nullable private byte[] secretKeyInfo;
+
+    /**
+     * Get the information used to generate the public key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public byte[] getPublicKeyInfo() {
+        return publicKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the public key.
+     * 
+     * @param info The info to set.
+     */
+    public void setPublicKeyInfo(@Nullable final byte[] info) {
+        publicKeyInfo = info;
+    }
+
+    /**
+     * Get the information used to generate the private key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public byte[] getPrivateKeyInfo() {
+        return privateKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the private key.
+     * 
+     * @param info The info to set.
+     */
+    public void setPrivateKeyInfo(@Nullable final byte[] info) {
+        privateKeyInfo = info;
+    }
+
+    /**
+     * Get the information used to generate the secret key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public byte[] getSecretKeyInfo() {
+        return secretKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the secret key.
+     * 
+     * @param info The info to set.
+     */
+    public void setSecretKeyInfo(@Nullable final byte[] info) {
+        secretKeyInfo = info;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PublicKey getPublicKey() {
+        if (null == getPublicKeyInfo()) {
+            return null;
+        }
+        return KeyPairUtil.decodePublicKey(getPublicKeyInfo());
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PrivateKey getPrivateKey() {
+        if (null == getPrivateKeyInfo()) {
+            return null;
+        }
+        return KeyPairUtil.decodePrivateKey(getPrivateKeyInfo(), getPrivateKeyPassword());
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected SecretKey getSecretKey() {
+        if (null ==  getSecretKeyInfo()) {
+            return null;
+        }
+        try {
+            return KeySupport.decodeSecretKey(decodeSecretKey(getSecretKeyInfo()), getSecretKeyAlgorithm());
+        } catch (final KeyException e) {
+            throw new BeanCreationException("Could not decode secret key", e);
+        }
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java
new file mode 100644
index 000000000..20d61f76f
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicInlineCredentialParser.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for BasicInline Credentials.
+ */
+public class BasicInlineCredentialParser extends AbstractBasicCredentialParser {
+
+    /** Element Name.*/
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "BasicInline");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return BasicInlineCredentialFactoryBean.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java
new file mode 100644
index 000000000..f70bcf263
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialFactoryBean.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import javax.annotation.Nullable;
+import javax.crypto.SecretKey;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.crypto.KeySupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.core.io.Resource;
+
+import com.google.common.io.ByteStreams;
+
+/**
+ * Spring bean factory for producing a {@link org.opensaml.security.credential.BasicCredential} from {@link Resource}s.
+ */
+public class BasicResourceCredentialFactoryBean extends AbstractBasicCredentialFactoryBean {
+
+    /** log. */
+    private final Logger log = LoggerFactory.getLogger(BasicResourceCredentialFactoryBean.class);
+
+    /** Configured public key Info. */
+    @Nullable private Resource publicKeyInfo;
+
+    /** Configured private key Info. */
+    @Nullable private Resource privateKeyInfo;
+
+    /** Configured secret key Info. */
+    @Nullable private Resource secretKeyInfo;
+
+    /**
+     * Get the information used to generate the public key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public Resource getPublicKeyInfo() {
+        return publicKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the public key.
+     * 
+     * @param info The info to set.
+     */
+    public void setPublicKeyInfo(@Nullable final Resource info) {
+        publicKeyInfo = info;
+    }
+
+    /**
+     * Get the information used to generate the private key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public Resource getPrivateKeyInfo() {
+        return privateKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the private key.
+     * 
+     * @param info The info to set.
+     */
+    public void setPrivateKeyInfo(@Nullable final Resource info) {
+        privateKeyInfo = info;
+    }
+
+    /**
+     * Get the information used to generate the secret key.
+     * 
+     * @return Returns the info.
+     */
+    @Nullable public Resource getSecretKeyInfo() {
+        return secretKeyInfo;
+    }
+
+    /**
+     * Set the information used to generate the secret key.
+     * 
+     * @param info The info to set.
+     */
+    public void setSecretKeyInfo(@Nullable final Resource info) {
+        secretKeyInfo = info;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PublicKey getPublicKey() {
+        if (null == getPublicKeyInfo()) {
+            return null;
+        }
+        try (InputStream is = getPublicKeyInfo().getInputStream()) {
+            return KeyPairUtil.readPublicKey(is);
+        } catch (final IOException e) {
+            log.error("{}: Could not decode public key: {}", getConfigDescription(), e.getMessage());
+            throw new BeanCreationException("Could not decode public key", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PrivateKey getPrivateKey() {
+        if (null == getPrivateKeyInfo()) {
+            return null;
+        }
+        try (InputStream is = getPrivateKeyInfo().getInputStream()) {
+            return KeySupport.decodePrivateKey(is, getPrivateKeyPassword());
+        } catch (final KeyException | IOException e) {
+            log.error("{}: Could not decode private key: {}", getConfigDescription(), e.getMessage());
+            throw new BeanCreationException("Could not decode private key", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected SecretKey getSecretKey() {
+        if (null == getSecretKeyInfo()) {
+            return null;
+        }
+        try (InputStream is = getSecretKeyInfo().getInputStream()) {
+            return KeySupport.decodeSecretKey(decodeSecretKey(ByteStreams.toByteArray(is)), getSecretKeyAlgorithm());
+        } catch (final KeyException | IOException e) {
+            log.error("{}: Could not decode secret key: {}", getConfigDescription(), e.getMessage());
+            throw new BeanCreationException("Could not decode secret key", e);
+        }
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java
new file mode 100644
index 000000000..f60d1ec8d
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicResourceCredentialParser.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for BasicFilesystem and BasicResourceBacked Credentials.
+ */
+public class BasicResourceCredentialParser extends AbstractBasicCredentialParser {
+
+    /** Type for Resource. */
+    public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "BasicResourceBacked");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return BasicResourceCredentialFactoryBean.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java
new file mode 100644
index 000000000..bbacc69e4
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBean.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyException;
+import java.security.PrivateKey;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.collection.LazyList;
+
+import org.opensaml.security.crypto.KeySupport;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+/**
+ * Spring bean factory for producing a {@link org.opensaml.security.x509.BasicX509Credential} from {@link Resource}s.
+ * 
+ * <p>
+ * This factory bean supports DER and PEM encoded certificate resources and encrypted and non-encrypted PKCS8, DER, or
+ * PEM encoded private key resources.
+ * </p>
+ */
+public class BasicX509CredentialFactoryBean extends AbstractX509CredentialFactoryBean {
+
+    /** log. */
+    private final Logger log = LoggerFactory.getLogger(BasicX509CredentialFactoryBean.class);
+
+    /** The specification of where the entity Resource is to be found. */
+    private Resource entityResource;
+
+    /** Where the certificates are to be found. */
+    private List<Resource> certificateResources;
+
+    /** Where the private key is to be found. */
+    private Resource privateKeyResource;
+
+    /** Where the crls are to be found. */
+    private List<Resource> crlResources;
+
+    /**
+     * Set the Resource with the entity certificate.
+     * 
+     * @param what The Resource to set.
+     */
+    public void setEntity(@Nonnull final Resource what) {
+        entityResource = what;
+    }
+
+    /**
+     * Sets the Resources which contain the certificates.
+     * 
+     * @param what The values to set.
+     */
+    public void setCertificates(@Nullable @NotEmpty final List<Resource> what) {
+        certificateResources = what;
+    }
+
+    /**
+     * Set the Resource with the entity certificate.
+     * 
+     * @param what The resource to set.
+     */
+    public void setPrivateKey(@Nullable final Resource what) {
+        privateKeyResource = what;
+    }
+
+    /**
+     * Sets the Resources which contain the crls.
+     * 
+     * @param what The value to set.
+     */
+    public void setCRLs(@Nullable @NotEmpty final List<Resource> what) {
+        crlResources = what;
+    }
+    
+    //
+    // BasicX509CredentialFactoryBean
+    //
+    /**
+     * Set the resource containing the private key.
+     * 
+     * @param res private key resource, never <code>null</code>
+     */
+    public void setPrivateKeyResource(@Nonnull final Resource res) {
+        setPrivateKey(res);
+    }
+
+    /**
+     * Set the password for the private key.
+     * 
+     * @param password password for the private key, may be null if the key is not encrypted
+     */
+    public void setPrivateKeyPassword(@Nullable final String password) {
+        setPrivateKeyPassword(password.toCharArray());
+    }
+
+    /**
+     * Set the certificate resource.
+     * 
+     * @param res certificate resource
+     */
+    public void setCertificateResource(@Nonnull final Resource res) {
+        setCertificates(Collections.singletonList(res));
+    }
+
+    /**
+     * Set the entityID for the credential.
+     * 
+     * @param id entityID
+     */
+    public void setEntityId(@Nullable final String id) {
+        setEntityID(id);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isSingleton() {
+        return true;
+    }
+
+    /** {@inheritDoc}. */
+    @Override @Nullable protected X509Certificate getEntityCertificate() {
+
+        if (null == entityResource) {
+            return null;
+        }
+        try {
+            final Collection<X509Certificate> certs = X509Support.decodeCertificates(entityResource.getInputStream());
+            if (certs.size() > 1) {
+                log.error("{}: Configuration element indicated an entityCertificate,"
+                        + " but multiple certificates were decoded", getConfigDescription());
+                throw new FatalBeanException("Configuration element indicated an entityCertificate,"
+                        + " but multiple certificates were decoded");
+            }
+            return certs.iterator().next();
+        } catch (final CertificateException | IOException e) {
+            log.error("{}: Could not decode provided Entity Certificate at {}: {}", getConfigDescription(),
+                    entityResource.getDescription(), e.getMessage());
+            throw new FatalBeanException("Could not decode provided Entity Certificate file "
+                    + entityResource.getDescription(), e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nonnull protected List<X509Certificate> getCertificates() {
+        
+        if (certificateResources == null) {
+            return Collections.emptyList();
+        }
+        
+        final List<X509Certificate> certificates = new LazyList<>();
+        for (final Resource r : certificateResources) {
+            try(InputStream is = r.getInputStream()) {
+                certificates.addAll(X509Support.decodeCertificates(is));
+            } catch (final CertificateException | IOException e) {
+                log.error("{}: could not decode CertificateFile at {}: {}", getConfigDescription(),
+                        r.getDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided CertificateFile: " + r.getDescription(), e);
+            }
+        }
+        return certificates;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PrivateKey getPrivateKey() {
+        if (null == privateKeyResource) {
+            return null;
+        }
+        try (InputStream is = privateKeyResource.getInputStream()) {
+            return KeySupport.decodePrivateKey(is, getPrivateKeyPassword());
+        } catch (final KeyException | IOException e) {
+            log.error("{}: Could not decode KeyFile at {}: {}", getConfigDescription(),
+                    privateKeyResource.getDescription(), e.getMessage());
+            throw new FatalBeanException("Could not decode provided KeyFile " + privateKeyResource.getDescription(), e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected List<X509CRL> getCRLs() {
+        if (null == crlResources) {
+            return null;
+        }
+        final List<X509CRL> crls = new LazyList<>();
+        for (final Resource crl : crlResources) {
+            try (InputStream is = crl.getInputStream()) {
+                crls.addAll(X509Support.decodeCRLs(is));
+            } catch (final CRLException | IOException e) {
+                log.error("{}: Could not decode CRL file at {}: {}", getConfigDescription(), crl.getDescription(),
+                        e.getMessage());
+                throw new FatalBeanException("Could not decode provided CRL file " + crl.getDescription(), e);
+            }
+        }
+        return crls;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java
new file mode 100644
index 000000000..f5f1b80de
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialFactoryBean.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.security.PrivateKey;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.collection.LazyList;
+
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+
+/**
+ * A factory bean to understand X509Inline credentials.
+ */
+public class X509InlineCredentialFactoryBean extends AbstractX509CredentialFactoryBean {
+
+    /** log. */
+    private final Logger log = LoggerFactory.getLogger(X509InlineCredentialFactoryBean.class);
+
+    /** The entity certificate. */
+    private String entityCertificate;
+
+    /** The certificates. */
+    private List<String> certificates;
+
+    /** The private key. */
+    private byte[] privateKey;
+
+    /** The crls. */
+    private List<String> crls;
+    
+    /**
+     * Set the file with the entity certificate.
+     * 
+     * @param entityCert The file to set.
+     */
+    public void setEntity(@Nonnull final String entityCert) {
+        entityCertificate = entityCert;
+    }
+
+    /**
+     * Sets the certificates.
+     * 
+     * @param certs The value to set.
+     */
+    public void setCertificates(@Nullable @NotEmpty final List<String> certs) {
+        certificates = certs;
+    }
+
+    /**
+     * Set the private key.
+     * 
+     * @param key The file to set.
+     */
+    public void setPrivateKey(@Nullable final byte[] key) {
+        privateKey = key;
+    }
+
+    /**
+     * Sets the files which contain the crls.
+     * 
+     * @param list The value to set.
+     */
+    public void setCRLs(@Nullable @NotEmpty final List<String> list) {
+        crls = list;
+    }
+
+    /** {@inheritDoc}. */
+    @Override @Nullable protected X509Certificate getEntityCertificate() {
+
+        if (null == entityCertificate) {
+            return null;
+        }
+        try {
+            return X509Support.decodeCertificate(entityCertificate);
+        } catch (final CertificateException e) {
+            log.error("{}: Could not decode provided Entity Certificate: {}", getConfigDescription(), e.getMessage());
+            throw new FatalBeanException("Could not decode provided Entity Certificate", e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nonnull protected List<X509Certificate> getCertificates() {
+        final List<X509Certificate> certs = new LazyList<>();
+        for (final String cert : certificates) {
+            try {
+                certs.add(X509Support.decodeCertificate(cert.trim()));
+            } catch (final CertificateException e) {
+                log.error("{}: Could not decode provided Certificate: {}", getConfigDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided Certificate", e);
+            }
+        }
+        return certs;
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected PrivateKey getPrivateKey() {
+        if (null == privateKey) {
+            return null;
+        }
+        return KeyPairUtil.decodePrivateKey(privateKey, getPrivateKeyPassword());
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nullable protected List<X509CRL> getCRLs() {
+        if (null == crls) {
+            return null;
+        }
+        final List<X509CRL> result = new LazyList<>();
+        for (final String crl : crls) {
+            try {
+                result.add(X509Support.decodeCRL(crl));
+            } catch (final CRLException | CertificateException e) {
+                log.error("{}: Could not decode provided CRL: {}", getConfigDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided CRL", e);
+            }
+        }
+        return result;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java
new file mode 100644
index 000000000..59450f9b2
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509InlineCredentialParser.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for X509Inline credentials.
+ */
+public class X509InlineCredentialParser extends AbstractX509CredentialParser {
+
+    /** Element Name.*/
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "X509Inline");
+
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return X509InlineCredentialFactoryBean.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java
new file mode 100644
index 000000000..886e836bc
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/X509ResourceCredentialParser.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for X509Filesystem credentials.
+ */
+public class X509ResourceCredentialParser extends AbstractX509CredentialParser {
+
+    /** Type for X509 credentials. */
+    public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "X509ResourceBacked");
+
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return BasicX509CredentialFactoryBean.class;
+    }
+
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java
new file mode 100644
index 000000000..b599cb5e9
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/credential/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Factory beans for various credential classes.
+ */
+
+package org.opensaml.spring.credential;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java
new file mode 100644
index 000000000..de8c5e25e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Supporting classes for Spring support.
+ */
+
+package org.opensaml.spring;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java
new file mode 100644
index 000000000..97d0a8f18
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractBasicPKIXValidationInfoFactoryBean.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+
+/**
+ * A factory bean to collect information to do with a {@link BasicPKIXValidationInformation}.
+ */
+public abstract class AbstractBasicPKIXValidationInfoFactoryBean extends
+        AbstractComponentAwareFactoryBean<BasicPKIXValidationInformation> {
+
+    /** Verification depth. */
+    @Nullable private Integer verifyDepth;
+
+    /** The description of the file with the configuration us. */
+    @Nonnull private String configDescription;
+
+    /**
+     * Get the verify Depth.
+     * 
+     * @return Returns the depth.
+     */
+    public int getVerifyDepth() {
+        return verifyDepth;
+    }
+
+    /**
+     * Set the verify Depth.
+     * 
+     * @param depth The value to set.
+     */
+    public void setVerifyDepth(final int depth) {
+        verifyDepth = depth;
+    }
+
+    /**
+     * For logging, get the description of the resource that defined this bean.
+     * 
+     * @return Returns the description.
+     */
+    public String getConfigDescription() {
+        return configDescription;
+    }
+
+    /**
+     * For logging, set the description of the resource that defined this bean.
+     * 
+     * @param desc what to set.
+     */
+    public void setConfigDescription(@Nonnull final String desc) {
+        configDescription = desc;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Class<?> getObjectType() {
+        return BasicPKIXValidationInformation.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected BasicPKIXValidationInformation doCreateInstance() throws Exception {
+        return new BasicPKIXValidationInformation(getCertificates(), getCRLs(), verifyDepth);
+    }
+
+    /**
+     * Get the configured certificates.
+     * 
+     * @return the certificates.
+     */
+    @Nullable protected abstract List<X509Certificate> getCertificates();
+
+    /**
+     * Get the configured CRL list.
+     * 
+     * @return the crls or null
+     */
+    @Nullable protected abstract List<X509CRL> getCRLs();
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java
new file mode 100644
index 000000000..a45782572
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractChainingParser.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.BeanMetadataElement;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Base Parser for trust engines of type SignatureChaining and Chaining.
+ */
+public abstract class AbstractChainingParser extends AbstractTrustEngineParser {
+    
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        final List<Element> childEngines =
+                ElementSupport.getChildElements(element, SecurityNamespaceHandler.TRUST_ENGINE_ELEMENT_NAME);
+        final List<Element> childEngineRefs =
+                ElementSupport.getChildElements(element, SecurityNamespaceHandler.TRUST_ENGINE_REF);
+        
+        final List<BeanMetadataElement> allChildren = new ManagedList<>(childEngines.size()+ childEngineRefs.size());
+        
+        allChildren.addAll(SpringSupport.parseCustomElements(childEngines, parserContext, builder));
+        
+        for (final Element ref:childEngineRefs) {
+            final String reference = StringSupport.trimOrNull(ref.getAttributeNS(null, "ref"));
+            if (null != reference) {
+                allChildren.add(new RuntimeBeanReference(StringSupport.trim(reference)));
+            }
+        }
+        builder.addConstructorArgValue(allChildren);
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java
new file mode 100644
index 000000000..4f0757e02
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractPKIXValidationInfoParser.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+/**
+ * Base parser for all <ValidationInfo> types. This does all the heavy lifting of creating lists of strings from
+ * the sub-elements. The derived classes specify which factory bean to create and that in turn converts from string to
+ * CRL or Certificate (either inline or from a file).
+ */
+public abstract class AbstractPKIXValidationInfoParser extends AbstractCustomBeanDefinitionParser {
+
+    /** The element <Certificate>. */
+    private static final QName CERTIFICATE =
+            new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "Certificate");
+
+    /** The element <CRL>. */
+    private static final QName CRL = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "CRL");
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        builder.addPropertyValue("configDescription", parserContext.getReaderContext().getResource().getDescription());
+
+        if (element.hasAttributeNS(null, "verifyDepth")) {
+            builder.addPropertyValue("verifyDepth",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "verifyDepth")));
+        }
+
+        final List<Element> certificates = ElementSupport.getChildElements(element, CERTIFICATE);
+        final List<String> certStrings = new ManagedList<>(certificates.size());
+
+        for (final Element cert : certificates) {
+            certStrings.add(cert.getTextContent());
+        }
+
+        builder.addPropertyValue("certificates", certStrings);
+
+        final List<Element> crls = ElementSupport.getChildElements(element, CRL);
+        final List<String> crlStrings = new ManagedList<>(certificates.size());
+
+        for (final Element crl : crls) {
+            crlStrings.add(crl.getTextContent());
+        }
+
+        builder.addPropertyValue("CRLs", crlStrings);
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java
new file mode 100644
index 000000000..e8e70bb9f
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractStaticPKIXParser.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.config.AbstractFactoryBean;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Base Parser for trust engines of type StaticPKIXKeySignature and StaticPKIXX509Credential.
+ */
+public abstract class AbstractStaticPKIXParser extends AbstractTrustEngineParser {
+
+    /** Validation Information. */
+    public static final QName VALIDATION_INFO = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "ValidationInfo");
+
+    /** Trusted Names Information. */
+    public static final QName TRUSTED_NAMES = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "TrustedName");
+
+    /**
+     * Get the definition for the {@link org.opensaml.security.x509.PKIXValidationInformationResolver}. This is
+     * constructed from the Trusted names and the Validation Info.
+     * 
+     * @param element what to parse
+     * @param parserContext the context to parse inside
+     * @return the definition
+     */
+    protected BeanDefinition getPKIXValidationInformationResolver(@Nonnull final Element element,
+            @Nonnull final ParserContext parserContext) {
+
+        final List<Element> validationInfoElements = ElementSupport.getChildElements(element, VALIDATION_INFO);
+        final List<Element> trustedNameElements = ElementSupport.getChildElements(element, TRUSTED_NAMES);
+
+        final BeanDefinitionBuilder builder =
+                BeanDefinitionBuilder.genericBeanDefinition(StaticPKIXValidationInformationResolver.class);
+        builder.addConstructorArgValue(
+                SpringSupport.parseCustomElements(validationInfoElements, parserContext, builder));
+        builder.addConstructorArgValue(
+                SpringSupport.getElementTextContentAsManagedList(trustedNameElements));
+
+        return builder.getBeanDefinition();
+    }
+
+    /**
+     * Get the definition for the {@link org.opensaml.security.x509.PKIXTrustEvaluator}. This is purely a
+     * {@link CertPathPKIXTrustEvaluator} constructed with whatever ValidationOptions we provide.
+     * 
+     * @param element what to parse
+     * @param parserContext the context to parse inside
+     * @return the definition
+     */
+    protected BeanDefinition getPKIXTrustEvaluator(@Nonnull final Element element,
+            @Nonnull final ParserContext parserContext) {
+
+        final BeanDefinitionBuilder builder =
+                BeanDefinitionBuilder.genericBeanDefinition(CertPathPKIXTrustEvaluator.class);
+
+        final List<Element> validationOptionsElements =
+                ElementSupport.getChildElements(element, PKIXValidationOptionsParser.ELEMENT_NAME);
+
+        if (null != validationOptionsElements && !validationOptionsElements.isEmpty()) {
+            builder.addConstructorArgValue(
+                    SpringSupport.parseCustomElements(validationOptionsElements, parserContext, builder));
+        }
+        return builder.getBeanDefinition();
+    }
+
+    /**
+     * Get the effective X509CredentialNameEvaluator to use. Currently we return a literal value, but in the future a
+     * BeanDefinition could be returned if necessary if we support toggling the name evaluator settings, hence the
+     * Object return type.
+     * 
+     * @param element what to parse
+     * @param parserContext the context to parse inside
+     * @return an X509CredentialNameEvaluator instance or a BeanDefinition. May be null.
+     */
+    protected Object getX509CredentialNameEvaluator(@Nonnull final Element element,
+            @Nonnull final ParserContext parserContext) {
+
+        final BeanDefinitionBuilder builder =
+                BeanDefinitionBuilder.genericBeanDefinition(X509CredentialNameEvaluatorFactoryBean.class);
+        final String attrValue = StringSupport.trimOrNull(element.getAttributeNS(null, "trustedNameCheckEnabled"));
+        if (attrValue != null) {
+            builder.addPropertyValue("trustedNameCheckEnabled", attrValue);
+        }
+        return builder.getBeanDefinition();
+    }
+
+    /**
+     * FactoryBean to do a deferred decision on whether to create a {@link X509CredentialNameEvaluator}. This is in a
+     * factory bean to allow for property replacement. The default (no value setting) is true.
+     */
+    protected static class X509CredentialNameEvaluatorFactoryBean extends
+            AbstractFactoryBean<X509CredentialNameEvaluator> {
+
+        /** Do we emit a {@link X509CredentialNameEvaluator} or not. */
+        private boolean trustedNameCheckEnabled = true;
+
+        /**
+         * Set whether to perform the trusted name check.
+         * 
+         * @param enabled whether we emit a {@link X509CredentialNameEvaluator} .
+         */
+        public void setTrustedNameCheckEnabled(final boolean enabled) {
+            trustedNameCheckEnabled = enabled;
+        }
+
+        /** {@inheritDoc} */
+        @Override public Class<?> getObjectType() {
+            return BasicX509CredentialNameEvaluator.class;
+        }
+
+        /** {@inheritDoc} */
+        @Override protected BasicX509CredentialNameEvaluator createInstance() throws Exception {
+            if (trustedNameCheckEnabled) {
+                return new BasicX509CredentialNameEvaluator();
+            }
+            return null;
+        }
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java
new file mode 100644
index 000000000..62401ab70
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/AbstractTrustEngineParser.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * Basis of all parsers for <security:TrustEngine>.
+ */
+public abstract class AbstractTrustEngineParser extends AbstractCustomBeanDefinitionParser {
+
+    /** {@inheritDoc} */
+    @Override protected String resolveId(final Element element, final AbstractBeanDefinition definition,
+            final ParserContext parserContext) {
+        return StringSupport.trimOrNull(element.getAttributeNS(null, "id"));
+    }
+
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+        builder.setLazyInit(true);
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java
new file mode 100644
index 000000000..1afb52949
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/CertPathPKIXValidationOptionsParser.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Spring bean definition parser for {urn:mace:shibboleth:2.0:security}ValidationOptions elements which have a type
+ * specialization of {urn:mace:shibboleth:2.0:security}CertPathValidationOptionsType.
+ */
+public class CertPathPKIXValidationOptionsParser extends PKIXValidationOptionsParser {
+    /** Schema type. */
+    public static final QName SCHEMA_TYPE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "CertPathValidationOptionsType");
+
+    /** PolicyOid Element type. */
+    public static final QName POLICY_OID_ELEMENT = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "PolicyOID");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return CertPathPKIXValidationOptions.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        if (element.hasAttributeNS(null, "forceRevocationEnabled")) {
+            builder.addPropertyValue("forceRevocationEnabled",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "forceRevocationEnabled")));
+        }
+
+        if (element.hasAttributeNS(null, "revocationEnabled")) {
+            builder.addPropertyValue("revocationEnabled",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "revocationEnabled")));
+        }
+
+        if (element.hasAttributeNS(null, "policyMappingInhibit")) {
+            builder.addPropertyValue("policyMappingInhibit",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "policyMappingInhibit")));
+        }
+
+        if (element.hasAttributeNS(null, "anyPolicyInhibit")) {
+            builder.addPropertyValue("anyPolicyInhibit",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "anyPolicyInhibit")));
+        }
+
+        final List<Element> childElems = ElementSupport.getChildElements(element, POLICY_OID_ELEMENT);
+        if (null != childElems && !childElems.isEmpty()) {
+            final List<String> initialPolicies = new ManagedList<>(childElems.size());
+            for (final Element nameElem : childElems) {
+                final String value = StringSupport.trimOrNull(nameElem.getTextContent());
+                if (null != value) {
+                    initialPolicies.add(value);
+                }
+            }
+            builder.addPropertyValue("initialPolicies", initialPolicies);
+        }
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java
new file mode 100644
index 000000000..eb8095519
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingParser.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type SignatureChaining.
+ */
+public class ChainingParser extends AbstractChainingParser {
+    
+    /** Schema type. */
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "Chaining");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return ChainingTrustEngineFactory.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java
new file mode 100644
index 000000000..60fc228d1
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingSignatureTrustEngineFactory.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.xmlsec.signature.support.SignatureTrustEngine;
+import org.opensaml.xmlsec.signature.support.impl.ChainingSignatureTrustEngine;
+
+/**
+ * Factory bean for {@link ChainingSignatureTrustEngine}. This finesses the issue that some parsers are not supported
+ * and return a bean of type object and these cannot be injected into the trust engine. This factory just filters the
+ * unsupported engines out. A warning has been issued at point of parse so no further logging is required.
+ */
+public class ChainingSignatureTrustEngineFactory extends
+        AbstractComponentAwareFactoryBean<ChainingSignatureTrustEngine> {
+
+    /** The unfiltered list of putative trust engines. */
+    private final List<Object> engines;
+
+    /**
+     * Constructor.
+     * 
+     * @param list the putative trust engines.
+     */
+    public ChainingSignatureTrustEngineFactory(@Nonnull final List<Object> list) {
+        engines = Constraint.isNotNull(list, "Engine list must be non null");
+    }
+
+    /** {@inheritDoc} */
+    @Override public Class<?> getObjectType() {
+        return ChainingSignatureTrustEngine.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected ChainingSignatureTrustEngine doCreateInstance() throws Exception {
+        final List<SignatureTrustEngine> list = new ArrayList<>(engines.size());
+
+        for (final Object engine : engines) {
+            if (engine instanceof SignatureTrustEngine) {
+                list.add((SignatureTrustEngine) engine);
+
+            }
+        }
+        return new ChainingSignatureTrustEngine(list);
+    }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java
new file mode 100644
index 000000000..6f388c08b
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/ChainingTrustEngineFactory.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ChainingTrustEngine;
+
+/**
+ * Factory bean for {@link ChainingTrustEngine}. This finesses the issue that some parsers are not supported
+ * and return a bean of type object and these cannot be injected into the trust engine. This factory just filters the
+ * unsupported engines out. A warning has been issued at point of parse so no further logging is required.
+ */
+public class ChainingTrustEngineFactory extends
+        AbstractComponentAwareFactoryBean<ChainingTrustEngine<?>> {
+
+    /** The unfiltered list of putative trust engines. */
+    private final List<Object> engines;
+
+    /**
+     * Constructor.
+     * 
+     * @param list the putative trust engines.
+     */
+    public ChainingTrustEngineFactory(@Nonnull final List<Object> list) {
+        engines = Constraint.isNotNull(list, "Engine list must be non null");
+    }
+
+    /** {@inheritDoc} */
+    @Override public Class<?> getObjectType() {
+        return ChainingTrustEngine.class;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    @Override protected ChainingTrustEngine<?> doCreateInstance() throws Exception {
+        final List<TrustEngine<?>> list = new ArrayList<>(engines.size());
+
+        for (final Object engine : engines) {
+            if (engine instanceof TrustEngine) {
+                list.add((TrustEngine<?>) engine);
+
+            }
+        }
+        return new ChainingTrustEngine(list);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java
new file mode 100644
index 000000000..36f4ec0ce
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoFactoryBean.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+
+/**
+ * File system specific bean for PKIXValidationInfo.
+ */
+public class PKIXInlineValidationInfoFactoryBean extends AbstractBasicPKIXValidationInfoFactoryBean {
+
+    /** log. */
+    private Logger log = LoggerFactory.getLogger(PKIXInlineValidationInfoFactoryBean.class);
+
+    /** The strings to be turned into the certificates. */
+    private List<String> certificateFiles;
+
+    /** The strings to be turned into the crls. */
+    private List<String> crlStrings;
+
+    /**
+     * Set the file names which we will convert into certificates.
+     * 
+     * @param certs the file names.
+     */
+    public void setCertificates(@Nullable final List<String> certs) {
+        certificateFiles = certs;
+    }
+
+    /**
+     * Set the file names which we will convert into crls.
+     * 
+     * @param crls the file names.
+     */
+    public void setCRLs(@Nullable final List<String> crls) {
+        crlStrings = crls;
+    }
+
+    /**
+     * Get the configured certificates.
+     * 
+     * @return the certificates null
+     */
+    @Override @Nullable protected List<X509Certificate> getCertificates() {
+        if (null == certificateFiles) {
+            return null;
+        }
+        final List<X509Certificate> certificates = new ArrayList<>(certificateFiles.size());
+        for (final String cert : certificateFiles) {
+            try {
+                certificates.add(X509Support.decodeCertificate(cert.trim()));
+            } catch (final CertificateException e) {
+                log.error("{}: Could not decode provided Certificate: {}", getConfigDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided Certificate", e);
+            }
+        }
+        return certificates;
+    }
+
+    /**
+     * Get the configured CRL list.
+     * 
+     * @return the crls or null
+     */
+    @Override @Nullable protected List<X509CRL> getCRLs() {
+        if (null == crlStrings) {
+            return null;
+        }
+        final List<X509CRL> crls = new ArrayList<>(crlStrings.size());
+        for (final String crl : crlStrings) {
+            try {
+                crls.add(X509Support.decodeCRL(crl));
+            } catch (final CRLException | CertificateException e) {
+                log.error("{}: Could not decode provided CRL: {}", getConfigDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided CRL", e);
+            }
+        }
+        return crls;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java
new file mode 100644
index 000000000..b723ef00e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXInlineValidationInfoParser.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for <ValidationInfo type="PKIXInline">.
+ * 
+ * <p>
+ * All of the heavy lifting is done in the super class and the associated factory bean (which gets the parameters of
+ * the type is wants by virtue of Springs type coercion).
+ * </p>
+ */
+public class PKIXInlineValidationInfoParser extends AbstractPKIXValidationInfoParser {
+    
+    /** Element Name.*/
+    public static final QName SCHEMA_TYPE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "PKIXInline");
+    
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return PKIXInlineValidationInfoFactoryBean.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java
new file mode 100644
index 000000000..52371d63e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoFactoryBean.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+/**
+ * File system specific bean for PKIXValidationInfo.
+ */
+public class PKIXResourceValidationInfoFactoryBean extends AbstractBasicPKIXValidationInfoFactoryBean {
+
+    /** log. */
+    private Logger log = LoggerFactory.getLogger(PKIXResourceValidationInfoFactoryBean.class);
+
+    /** The file to be turned into the certificates. */
+    private List<Resource> certificateFiles;
+
+    /** The file to be turned into the crls. */
+    private List<Resource> crlFiles;
+
+    /**
+     * Set the file names which we will convert into certificates.
+     * 
+     * @param certs the file names.
+     */
+    public void setCertificates(@Nullable final List<Resource> certs) {
+        certificateFiles = certs;
+    }
+
+    /**
+     * Set the file names which we will convert into crls.
+     * 
+     * @param crls the file names.
+     */
+    public void setCRLs(@Nullable final List<Resource> crls) {
+        crlFiles = crls;
+    }
+
+    /**
+     * Get the configured certificates.
+     * 
+     * @return the certificates null
+     */
+    @Override @Nullable protected List<X509Certificate> getCertificates() {
+        if (null == certificateFiles) {
+            return null;
+        }
+        final List<X509Certificate> certificates = new ArrayList<>(certificateFiles.size());
+        for (final Resource f : certificateFiles) {
+            try(InputStream is = f.getInputStream()) {
+                certificates.addAll(X509Support.decodeCertificates(is));
+            } catch (final CertificateException | IOException e) {
+                log.error("{}: Could not decode Certificate at {}: {}", getConfigDescription(), f.getDescription(),
+                        e.getMessage());
+                throw new FatalBeanException("Could not decode provided CertificateFile: " + f.getDescription(), e);
+            }
+        }
+        return certificates;
+    }
+
+    /**
+     * Get the configured CRL list.
+     * 
+     * @return the crls or null
+     */
+    @Override @Nullable protected List<X509CRL> getCRLs() {
+        if (null == crlFiles) {
+            return null;
+        }
+        final List<X509CRL> crls = new ArrayList<>(crlFiles.size());
+        for (final Resource crlFile : crlFiles) {
+            try(InputStream is = crlFile.getInputStream())  {
+                crls.addAll(X509Support.decodeCRLs(is));
+            } catch (final CRLException | IOException e) {
+                log.error("{}: Could not decode CRL file at {}: {}", getConfigDescription(), crlFile.getDescription(),
+                        e.getMessage());
+                throw new FatalBeanException("Could not decode provided CRL file " + crlFile.getDescription(), e);
+            }
+        }
+        return crls;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java
new file mode 100644
index 000000000..e0bac86ea
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXResourceValidationInfoParser.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for <ValidationInfo type="PKIXFilesystem"> and <ValidationInfo type="PKIXResourceBacked">.
+ * 
+ * <p>
+ * All of the heavy lifting is done in the super class and the associated factory bean (which gets the parameters of the
+ * type is wants by virtue of Springs type coercion).
+ * </p>
+ */
+public class PKIXResourceValidationInfoParser extends AbstractPKIXValidationInfoParser {
+
+    /** Schema type for PKIXResourceBackedValidationInformation. */
+    public static final QName TYPE_NAME_RESOURCE = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "PKIXResourceBacked");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return PKIXResourceValidationInfoFactoryBean.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java
new file mode 100644
index 000000000..fe32c7348
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/PKIXValidationOptionsParser.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.ext.spring.util.AbstractCustomBeanDefinitionParser;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * A Parser for the < ValidationOptions > within a StaticPKIXSignature.
+ */
+public class PKIXValidationOptionsParser extends AbstractCustomBeanDefinitionParser {
+
+    /** Validation Options. */
+    public static final QName ELEMENT_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "ValidationOptions");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return PKIXValidationOptions.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        if (element.hasAttributeNS(null, "processEmptyCRLs")) {
+            builder.addPropertyValue("processEmptyCRLs",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "processEmptyCRLs")));
+        }
+
+        if (element.hasAttributeNS(null, "processExpiredCRLs")) {
+            builder.addPropertyValue("processExpiredCRLs",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "processExpiredCRLs")));
+        }
+
+        if (element.hasAttributeNS(null, "processCredentialCRLs")) {
+            builder.addPropertyValue("processCredentialCRLs",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "processCredentialCRLs")));
+        }
+
+        if (element.hasAttributeNS(null, "defaultVerificationDepth")) {
+            builder.addPropertyValue("defaultVerificationDepth",
+                    StringSupport.trimOrNull(element.getAttributeNS(null, "defaultVerificationDepth")));
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean shouldGenerateId() {
+        return true;
+    }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java
new file mode 100644
index 000000000..dbfc6f9e5
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/SignatureChainingParser.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type SignatureChaining.
+ */
+public class SignatureChainingParser extends AbstractChainingParser {
+
+    /** Schema type. */
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "SignatureChaining");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return ChainingSignatureTrustEngineFactory.class;
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java
new file mode 100644
index 000000000..3d80d2747
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBean.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.cryptacular.EncodingException;
+import org.cryptacular.StreamException;
+import org.cryptacular.util.KeyPairUtil;
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.opensaml.security.x509.X509Support;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+
+/**
+ * Factory bean for simple use cases involving the {@link ExplicitKeyTrustEngine} and static credentials.
+ * 
+ * @since 3.3.0
+ */
+public class StaticExplicitKeyFactoryBean extends AbstractComponentAwareFactoryBean<ExplicitKeyTrustEngine> {
+
+    /** Class logger. */
+    @Nonnull private Logger log = LoggerFactory.getLogger(StaticExplicitKeyFactoryBean.class);
+
+    /** The resources to be turned into keys. */
+    private List<Resource> keyResources;
+
+    /** The resources to be turned into certificates. */
+    private List<Resource> certificateResources;
+
+    /** Constructor. */
+    public StaticExplicitKeyFactoryBean() {
+        keyResources = Collections.emptyList();
+        certificateResources = Collections.emptyList();
+    }
+    
+    /**
+     * Set the resources which we will convert into certificates.
+     * 
+     * @param keys the resources
+     */
+    public void setPublicKeys(@Nullable final List<Resource> keys) {
+        keyResources = keys != null ? keys : Collections.emptyList();
+    }
+    
+    /**
+     * Set the resources which we will convert into certificates.
+     * 
+     * @param certs the resources
+     */
+    public void setCertificates(@Nullable final List<Resource> certs) {
+        certificateResources = certs != null ? certs : Collections.emptyList();
+    }
+
+    /**
+     * Get the configured certificates.
+     * 
+     * @return the certificates null
+     */
+    @Nullable @NonnullElements protected List<Credential> getCredentials() {
+        
+        final List<Credential> credentials = new ArrayList<>(keyResources.size() + certificateResources.size());
+
+        for (final Resource f : keyResources) {
+            try(final InputStream is = f.getInputStream()) {
+                credentials.add(new BasicCredential(KeyPairUtil.readPublicKey(is)));
+            } catch (final EncodingException|StreamException|IOException e) {
+                log.error("Could not decode public key from {}: {}", f.getDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode public key from " + f.getDescription(), e);
+            }
+        }
+                
+        for (final Resource f : certificateResources) {
+            try(final InputStream is = f.getInputStream()) {
+                final Collection<X509Certificate> raw = X509Support.decodeCertificates(is);
+                if (raw != null) {
+                    raw.forEach(x -> {
+                        if (x != null) {
+                            credentials.add(new BasicX509Credential(x));
+                            }
+                        }
+                    );
+                }
+                
+            } catch (final CertificateException | IOException e) {
+                log.error("Could not decode certificate from {}: {}", f.getDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode certificate from " + f.getDescription(), e);
+            }
+        }
+
+        return credentials;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Class<?> getObjectType() {
+        return ExplicitKeyTrustEngine.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected ExplicitKeyTrustEngine doCreateInstance() throws Exception {
+        return new ExplicitKeyTrustEngine(new StaticCredentialResolver(getCredentials()));
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java
new file mode 100644
index 000000000..52ddda134
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeyParser.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticExplicitKey TrustEngine.
+ */
+public class StaticExplicitKeyParser extends AbstractTrustEngineParser {
+
+    /** Schema type. */
+    public static final QName TYPE_NAME =
+            new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "StaticExplicitKey");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return ExplicitKeyTrustEngine.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        final List<Element> credentials =
+                ElementSupport.getChildElements(element, SecurityNamespaceHandler.CREDENTIAL_ELEMENT_NAME);
+
+        final BeanDefinitionBuilder resolver =
+                BeanDefinitionBuilder.genericBeanDefinition(StaticCredentialResolver.class);
+        resolver.addConstructorArgValue(SpringSupport.parseCustomElements(credentials, parserContext, resolver));
+
+        builder.addConstructorArgValue(resolver.getBeanDefinition());
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java
new file mode 100644
index 000000000..ab5fd8676
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParser.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import net.shibboleth.ext.spring.util.SpringSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
+import org.opensaml.xmlsec.signature.support.impl.ExplicitKeySignatureTrustEngine;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticExplicitKeySignature.
+ */
+public class StaticExplicitKeySignatureParser extends AbstractTrustEngineParser {
+
+    /** Schema type. */
+    public static final QName TYPE_NAME =
+            new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE, "StaticExplicitKeySignature");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return ExplicitKeySignatureTrustEngine.class;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        final List<Element> credentials =
+                ElementSupport.getChildElements(element, SecurityNamespaceHandler.CREDENTIAL_ELEMENT_NAME);
+
+        final BeanDefinitionBuilder resolver =
+                BeanDefinitionBuilder.genericBeanDefinition(StaticCredentialResolver.class);
+        resolver.addConstructorArgValue(SpringSupport.parseCustomElements(credentials, parserContext, resolver));
+
+        builder.addConstructorArgValue(resolver.getBeanDefinition());
+
+        builder.addConstructorArgValue(DefaultSecurityConfigurationBootstrap
+                .buildBasicInlineKeyInfoCredentialResolver());
+    }
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java
new file mode 100644
index 000000000..8a70ba357
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXFactoryBean.java
@@ -0,0 +1,277 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.Security;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.security.x509.PKIXTrustEvaluator;
+import org.opensaml.security.x509.X509Support;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.core.io.Resource;
+
+
+import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * File system specific bean for PKIXX509CredentialTrustEngine.
+ * 
+ * @since 3.3.0
+ */
+public class StaticPKIXFactoryBean extends AbstractComponentAwareFactoryBean<PKIXX509CredentialTrustEngine> {
+
+    /** log. */
+    @Nonnull private Logger log = LoggerFactory.getLogger(StaticPKIXFactoryBean.class);
+
+    /** Certificate resources. */
+    @Nullable private List<Resource> certificateResources;
+
+    /** CRL resources. */
+    @Nullable private List<Resource> crlResources;
+
+    /** Verification depth. */
+    @Nullable private Integer verifyDepth;
+    
+    /** Explicit subject name(s) to match. */
+    @Nullable private Set<String> trustedNames;
+    
+    /** Whether to enable name checking. If true a default implementation will be used.
+     * See also: {@link #credentialNameEvaluator}. */
+    private boolean checkNames;
+
+    /** Custom instance of {@link PKIXTrustEvaluator} to use. */
+    private PKIXTrustEvaluator trustEvaluator;
+
+    /** Custom instance of {@link X509CredentialNameEvaluator} to use.
+     * A non-null value overrides {@link #checkNames}. */
+    private X509CredentialNameEvaluator credentialNameEvaluator;
+
+    /** Constructor. */
+    public StaticPKIXFactoryBean() {
+        checkNames = true;
+    }
+    
+    /** {@inheritDoc} */
+    @Override
+    public Class<?> getObjectType() {
+        return PKIXX509CredentialTrustEngine.class;
+    }
+    
+    /**
+     * Set the resources which we will convert into certificates.
+     * 
+     * @param certs the resources
+     */
+    public void setCertificates(@Nullable final List<Resource> certs) {
+        certificateResources = certs;
+    }
+
+    /**
+     * Set the resources which we will convert into CRLs.
+     * 
+     * @param crls the resources
+     */
+    public void setCRLs(@Nullable final List<Resource> crls) {
+        crlResources = crls;
+    }
+
+    /**
+     * Set the verify depth.
+     * 
+     * @param depth value to set
+     */
+    public void setVerifyDepth(final int depth) {
+        verifyDepth = depth;
+    }
+
+    /**
+     * Set whether the perform name checking in the PKIX layer.
+     *
+     * <p>
+     * Defaults to "true", should generally be disabled when used with an HTTP client
+     * that is already checking names.
+     * </p>
+     *
+     * <p>
+     * If true a default implementation will be used unless a specific name evaluator impl has been supplied.
+     * See also: {@link #setCredentialNameEvaluator(X509CredentialNameEvaluator)}.
+     * </p>
+     *
+     * @param flag flag to set
+     * 
+     * @since 3.4.0
+     */
+    public void setCheckNames(final boolean flag) {
+        checkNames = flag;
+    }
+    
+    /**
+     * Set explicitly trusted names to match against credential.
+     * 
+     * @param names explicitly trusted names
+     * 
+     * @since 3.4.0
+     */
+    public void setTrustedNames(@Nullable @NonnullElements final Collection<String> names) {
+        if (names != null) {
+            trustedNames = Set.copyOf(names);
+        } else {
+            trustedNames = null;
+        }
+    }
+
+    /**
+     * Set the custom instance of {@link PKIXTrustEvaluator} to use.
+     *
+     * @param evaluator The trustEvaluator to set.
+     */
+    public void setTrustEvaluator(@Nullable final PKIXTrustEvaluator evaluator) {
+        trustEvaluator = evaluator;
+    }
+
+    /**
+     * Set the custom instance of {@link X509CredentialNameEvaluator} to use.
+     *
+     * <p>
+     * A non-null value overrides {@link #setCheckNames(boolean)}.
+     * </p>
+     *
+     * @param evaluator The credentialNameEvaluator to set.
+     */
+    public void setCredentialNameEvaluator(@Nullable final X509CredentialNameEvaluator evaluator) {
+        credentialNameEvaluator = evaluator;
+    }
+
+    /**
+     * Get the configured certificates.
+     * 
+     * @return the certificates
+     */
+    @Nonnull @NonnullElements protected List<X509Certificate> getCertificates() {
+        if (certificateResources == null) {
+            return Collections.emptyList();
+        }
+        
+        final List<X509Certificate> certificates = new ArrayList<>(certificateResources.size());
+        for (final Resource f : certificateResources) {
+            try(final InputStream is = f.getInputStream()) {
+                certificates.addAll(X509Support.decodeCertificates(is));
+            } catch (final CertificateException | IOException e) {
+                log.error("Could not decode Certificate at {}: {}", f.getDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided CertificateFile: " + f.getDescription(), e);
+            }
+        }
+        return certificates;
+    }
+
+    /**
+     * Get the configured CRL list.
+     * 
+     * @return the crls
+     */
+    @Nonnull @NonnullElements protected List<X509CRL> getCRLs() {
+        if (crlResources == null) {
+            return Collections.emptyList();
+        }
+        
+        final List<X509CRL> crls = new ArrayList<>(crlResources.size());
+        for (final Resource crlFile : crlResources) {
+            try(final InputStream is = crlFile.getInputStream())  {
+                crls.addAll(X509Support.decodeCRLs(is));
+            } catch (final CRLException | IOException e) {
+                log.error("Could not decode CRL file at {}: {}", crlFile.getDescription(), e.getMessage());
+                throw new FatalBeanException("Could not decode provided CRL file " + crlFile.getDescription(), e);
+            }
+        }
+        return crls;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected PKIXX509CredentialTrustEngine doCreateInstance() throws Exception {
+        final BasicPKIXValidationInformation info =
+                new BasicPKIXValidationInformation(getCertificates(), getCRLs(), verifyDepth);
+        
+        final StaticPKIXValidationInformationResolver resolver =
+                new StaticPKIXValidationInformationResolver(Collections.singletonList(info), trustedNames, checkNames);
+
+        final PKIXTrustEvaluator pkixTrustEvaluator =
+                trustEvaluator != null ? trustEvaluator : new CertPathPKIXTrustEvaluator();
+
+        final X509CredentialNameEvaluator credNameEvaluator =
+                credentialNameEvaluator != null ? credentialNameEvaluator :
+                    (checkNames ? new BasicX509CredentialNameEvaluator() : null);
+
+        validateConfiguration(pkixTrustEvaluator);
+
+        return new PKIXX509CredentialTrustEngine(resolver, pkixTrustEvaluator, credNameEvaluator);
+    }
+
+    /**
+     * Validate the configuration of the effective {@link PKIXTrustEvaluator}.
+     *
+     * @param pkixTrustEvaluator the instance whose configuration is to be evaluated
+     *
+     * @throws Exception if configuration issues are encountered
+     */
+    protected void validateConfiguration(@Nonnull final PKIXTrustEvaluator pkixTrustEvaluator) throws Exception {
+        if (CertPathPKIXTrustEvaluator.class.isInstance(pkixTrustEvaluator)
+                && CertPathPKIXValidationOptions.class.isInstance(pkixTrustEvaluator.getPKIXValidationOptions())) {
+            
+            final CertPathPKIXValidationOptions certPathOptions =
+                    CertPathPKIXValidationOptions.class.cast(pkixTrustEvaluator.getPKIXValidationOptions());
+
+           if (certPathOptions.isForceRevocationEnabled() && certPathOptions.isRevocationEnabled()
+                   && getCRLs().isEmpty()
+                   && ! Boolean.getBoolean("com.sun.security.enableCRLDP")
+                   && ! "true".equalsIgnoreCase(StringSupport.trimOrNull(Security.getProperty("oscp.enable"))) ) {
+
+               log.error("Certificate revocation checking was force enabled, "
+                       + "but no static CRLs were supplied and both CRLDP and OCSP processing is disabled");
+
+               throw new FatalBeanException("Certificate revocation checking was force enabled, "
+                       + "but no static CRLs were supplied and both CRLDP and OCSP processing is disabled");
+           }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java
new file mode 100644
index 000000000..21f527f61
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXSignatureParser.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.opensaml.xmlsec.config.impl.DefaultSecurityConfigurationBootstrap;
+import org.opensaml.xmlsec.signature.support.impl.PKIXSignatureTrustEngine;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticPKIXKeySignature.
+ */
+public class StaticPKIXSignatureParser extends AbstractStaticPKIXParser {
+
+    /** Schema type. */
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "StaticPKIXSignature");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return PKIXSignatureTrustEngine.class;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * <p>We call into
+     * {@link 
+     * PKIXSignatureTrustEngine#PKIXSignatureTrustEngine(
+     * org.opensaml.security.x509.PKIXValidationInformationResolver, 
+     * org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver, 
+     * org.opensaml.security.x509.PKIXTrustEvaluator, 
+     * org.opensaml.security.x509.impl.X509CredentialNameEvaluator)}.
+     * </p>
+     */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        builder.addConstructorArgValue(getPKIXValidationInformationResolver(element, parserContext));
+        builder.addConstructorArgValue(DefaultSecurityConfigurationBootstrap
+                .buildBasicInlineKeyInfoCredentialResolver());
+        builder.addConstructorArgValue(getPKIXTrustEvaluator(element, parserContext));
+        builder.addConstructorArgValue(getX509CredentialNameEvaluator(element, parserContext));
+    }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java
new file mode 100644
index 000000000..afd63585e
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParser.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.spring.SecurityNamespaceHandler;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+/**
+ * Parser for trust engines of type StaticPKIXX509Credential.
+ */
+public class StaticPKIXX509CredentialParser extends AbstractStaticPKIXParser {
+
+    /** Schema type. */
+    public static final QName TYPE_NAME = new QName(SecurityNamespaceHandler.SECURITY_NAMESPACE,
+            "StaticPKIXX509Credential");
+
+    /** {@inheritDoc} */
+    @Override protected Class<?> getBeanClass(final Element element) {
+        return PKIXX509CredentialTrustEngine.class;
+    }
+
+    /**
+     * {@inheritDoc}
+     * 
+     * <p>
+     * We call into
+     * {@link PKIXX509CredentialTrustEngine#PKIXX509CredentialTrustEngine(
+     *   org.opensaml.security.x509.PKIXValidationInformationResolver,
+     *   org.opensaml.security.x509.PKIXTrustEvaluator,
+     *   org.opensaml.security.x509.impl.X509CredentialNameEvaluator)}.
+     * </p>
+     */
+    @Override protected void doParse(final Element element, final ParserContext parserContext,
+            final BeanDefinitionBuilder builder) {
+        super.doParse(element, parserContext, builder);
+
+        builder.addConstructorArgValue(getPKIXValidationInformationResolver(element, parserContext));
+        builder.addConstructorArgValue(getPKIXTrustEvaluator(element, parserContext));
+        builder.addConstructorArgValue(getX509CredentialNameEvaluator(element, parserContext));
+    }
+
+}
diff --git a/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java b/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java
new file mode 100644
index 000000000..5bf1420a2
--- /dev/null
+++ b/opensaml-spring/src/main/java/org/opensaml/spring/trust/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Factory beans for trust engines.
+ */
+
+package org.opensaml.spring.trust;
\ No newline at end of file
diff --git a/opensaml-spring/src/main/resources/META-INF/spring.handlers b/opensaml-spring/src/main/resources/META-INF/spring.handlers
new file mode 100644
index 000000000..2f46adcc7
--- /dev/null
+++ b/opensaml-spring/src/main/resources/META-INF/spring.handlers
@@ -0,0 +1 @@
+urn\:mace\:shibboleth\:2.0\:security            = org.opensaml.spring.SecurityNamespaceHandler
diff --git a/opensaml-spring/src/main/resources/META-INF/spring.schemas b/opensaml-spring/src/main/resources/META-INF/spring.schemas
new file mode 100644
index 000000000..c71f89d10
--- /dev/null
+++ b/opensaml-spring/src/main/resources/META-INF/spring.schemas
@@ -0,0 +1,5 @@
+# Modern variant
+http\://shibboleth.net/schema/idp/shibboleth-security.xsd = schema/shibboleth-security.xsd
+
+# Legacy variant
+classpath\:/schema/shibboleth-2.0-security.xsd = schema/shibboleth-security.xsd
diff --git a/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd b/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd
new file mode 100644
index 000000000..95ad23fb0
--- /dev/null
+++ b/opensaml-spring/src/main/resources/schema/shibboleth-security.xsd
@@ -0,0 +1,612 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sec="urn:mace:shibboleth:2.0:security" targetNamespace="urn:mace:shibboleth:2.0:security" elementFormDefault="qualified">
+        
+    <!-- CREDENTIAL RELATED OBJECTS -->
+    <element name="Credential" type="sec:CredentialType"/>
+
+    <complexType name="X509Inline">
+        <annotation>
+            <documentation>
+                Allows credentials to be components to be specified as content within the child elements. Keys,
+                Certificates, and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:X509Credential"/>
+        </complexContent>
+    </complexType>
+
+    <complexType name="X509ResourceBacked">
+        <annotation>
+            <documentation>
+                Allows credential components to be loaded from a Spring Resource. Keys, Certificates, and CRLs may be
+                PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:X509Credential"/>
+        </complexContent>
+    </complexType>
+
+    <complexType name="X509Credential" abstract="true">
+        <annotation>
+            <documentation>
+                Defines the components of an X.509 credential.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:CredentialType">
+                <sequence>
+                    <element name="PrivateKey" minOccurs="0">
+                        <annotation>
+                            <documentation>Credential's RSA/DSA private key.</documentation>
+                        </annotation>
+                    </element>
+                    <element name="Certificate" minOccurs="1" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Certificate associated with the credential. More than one certificate
+                                may be present within a single element, if the encoding form used allows
+                                it, or multiple certificate elements may be used, or both.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element name="CRL" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Certificate revocation list associated with the Credential. More than
+                                one CRL may be present within a single element, if the encoding form
+                                used allows it, or multiple CRL elements may be used, or both.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="BasicInline">
+        <annotation>
+            <documentation>
+                Allows credentials to be components to be specified as content within the child elements.
+                Keys may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:BasicCredential"/>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="BasicResourceBacked">
+        <annotation>
+            <documentation>
+                Allows credential components to be specified by Spring Resource specification.
+                Keys may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:BasicCredential"/>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="BasicCredential" abstract="true">
+        <annotation>
+            <documentation>
+                Defines the components of a basic credential containing either a 
+                public key and optional private key, or a symmetric (secret) key.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:CredentialType">
+                <sequence>
+                    <choice>
+                        <element name="SecretKey">
+                            <annotation>
+                                <documentation>Credential's symmetric key.</documentation>
+                            </annotation>
+                            <complexType>
+                                <simpleContent>
+                                    <extension base="string">
+                                        <attribute name="algorithm" type="sec:string" use="required">
+                                            <annotation>
+                                                <documentation>
+                                                    The JCA key algorithm identifier.
+                                                </documentation>
+                                            </annotation>
+                                        </attribute>
+                                        <attribute name="encoding" use="required">
+                                            <annotation>
+                                                <documentation>
+                                                    The encoded format of the key data. Defaults to: base64.
+                                                </documentation>
+                                            </annotation>
+                                            <simpleType>
+                                                <restriction base="string">
+                                                    <enumeration value="binary" />
+                                                    <enumeration value="hex" />
+                                                    <enumeration value="base64" />
+                                                </restriction>
+                                            </simpleType>
+                                        </attribute>
+                                    </extension>
+                                </simpleContent>
+                            </complexType>
+                        </element>
+                        <sequence>
+                            <element name="PrivateKey" minOccurs="0">
+                                <annotation>
+                                    <documentation>Credential's RSA/DSA private key.</documentation>
+                                </annotation>
+                            </element>
+                            <element name="PublicKey">
+                                <annotation>
+                                    <documentation>Credential's RSA/DSA public key.</documentation>
+                                </annotation>
+                            </element>
+                        </sequence>
+                    </choice>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+
+    <complexType name="CredentialType" abstract="true">
+        <annotation>
+            <documentation>Base type for credential information.</documentation>
+        </annotation>
+        <sequence>
+            <element name="KeyName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+                <annotation>
+                    <documentation>Name(s) of the key this credential represents.</documentation>
+                </annotation>
+            </element>
+        </sequence>
+        <attribute name="id" type="sec:string">
+            <annotation>
+                <documentation>Unique id for this credential.</documentation>
+            </annotation>
+        </attribute>
+        <attribute name="entityID" type="sec:string">
+            <annotation>
+                <documentation>Identifier for the entity which owns this credential.</documentation>
+            </annotation>
+        </attribute>
+        <attribute name="usage" type="sec:CredentialUsageType">
+            <annotation>
+                <documentation>
+                    Usage type for this credential. Acceptable values are "Encryption" or "Signing". If no usage type is
+                    given components may choose to use the credential for either encryption or signing operations.
+                </documentation>
+            </annotation>
+        </attribute>
+    </complexType>
+
+    <simpleType name="CredentialUsageType">
+        <restriction base="string">
+            <enumeration value="Encryption"/>
+            <enumeration value="Signing"/>
+        </restriction>
+    </simpleType>
+
+    <complexType name="PasswordBearingString">
+        <simpleContent>
+            <extension base="string">
+                <attribute name="password" type="string">
+                    <annotation>
+                        <documentation>
+                            Password associated with the resource identified by elements of this type.
+                        </documentation>
+                    </annotation>
+                </attribute>
+            </extension>
+        </simpleContent>
+    </complexType>
+    
+    <!-- VALIDATION RELATED OBJECTS, FOR EXAMPLE PKIX INFO -->
+    <element name="ValidationInfo" type="sec:ValidationInfoType"/>
+    
+    <element name="ValidationOptions" type="sec:ValidationOptionsType"/>
+    
+    <complexType name="PKIXInline">
+        <annotation>
+            <documentation>
+                Allows PKIX validation info components to be specified as content within the child elements.
+                Certificates and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:PKIXValidationInfoType"/>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="PKIXResourceBacked">
+        <annotation>
+            <documentation>
+                Allows PKIX validation info components to be specified by a Spring Resource specification.
+                Certificates, and CRLs may be PKCS#12, DER, or PEM encoded and may be encrypted or not.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:PKIXValidationInfoType"/>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="PKIXValidationInfoType" abstract="true">
+        <annotation>
+            <documentation>
+                Defines the components of a set of PKIX validation information.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:ValidationInfoType">
+                <sequence>
+                    <element name="Certificate" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Trusted certificates, typically of root and intermediate CA's , which are used
+                                as input to the PKIX validation process.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element name="CRL" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Certificate revocation lists which are used as input to the PKIX validation process.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+                <attribute name="verifyDepth" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            The maximum path verification depth to consider when constructing a PKIX cert path.
+                        </documentation>
+                    </annotation>
+                </attribute>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="ValidationInfoType" abstract="true">
+        <annotation>
+            <documentation>Base type for validation information.</documentation>
+        </annotation>
+        <attribute name="id" type="sec:string" use="required">
+            <annotation>
+                <documentation>Unique id for this validation info set.</documentation>
+            </annotation>
+        </attribute>
+    </complexType>
+    
+    <complexType name="ValidationOptionsType">
+        <annotation>
+            <documentation>Type for basic PKIX validation options set for PKIX trust engines.</documentation>
+        </annotation>
+        <attribute name="processEmptyCRLs" type="sec:string">
+            <annotation>
+                <documentation>Flag as to whether empty CRL's will be processed. Defaults to true.</documentation>
+            </annotation>
+        </attribute>
+        <attribute name="processExpiredCRLs" type="sec:string">
+            <annotation>
+                <documentation>Flag as to whether expired CRL's will be processed. Defaults to true.</documentation>
+            </annotation>
+        </attribute>
+        <attribute name="processCredentialCRLs" type="sec:string">
+            <annotation>
+                <documentation>
+                    Flag as to whether CRL's supplied in the untrusted credential 
+                    being evaluated will be processed. Defaults to true.
+                </documentation>
+            </annotation>
+        </attribute>
+        <attribute name="defaultVerificationDepth" type="sec:string">
+            <annotation>
+                <documentation>Default PKIX path verification depth. Defaults to 1.</documentation>
+            </annotation>
+        </attribute>
+    </complexType>
+    
+    <complexType name="CertPathValidationOptionsType">
+        <annotation>
+            <documentation>
+                Type specialization for PKIX validation options set for PKIX trust engines 
+                using the Java CertPath API.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:ValidationOptionsType">
+                <sequence>
+                    <element name="PolicyOID" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Sets the initial policy identifiers (OID strings) for the underlying CertPath Provider,
+                                i.e. those policies that are acceptable to the certificate user.
+                                See also RFC 5280, section 6.1.1 (c).
+                                If no policy identifier is specified, any policy is considered acceptable.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+                <attribute name="forceRevocationEnabled" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            If true, the revocation behavior of the underlying CertPath provider will be forced to the
+                            value supplied by the revocationEnabled attribute. If false, the revocation behavior
+                            of the underlying provider will be determined by the PKIXTrustEvaluator implementation.
+                            Defaults to false.
+                        </documentation>
+                    </annotation>
+                </attribute>
+                <attribute name="revocationEnabled" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            If the attribute forceRevocationEnabled is true, the revocation behavior of the underlying CertPath
+                            Provider will be forced to this value. If the former is false, the revocation behavior
+                            of the underlying provider will be determined by the PKIXTrustEvaluator implementation.
+                            Defaults to true.
+                        </documentation>
+                    </annotation>
+                </attribute>
+                <attribute name="policyMappingInhibit" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            Sets the policy mapping inhibited flag for the underlying CertPath Provider.
+                            See also RFC 5280, section 6.1.1 (e).
+                            Defaults to false.
+                        </documentation>
+                    </annotation>
+                </attribute>
+                <attribute name="anyPolicyInhibit" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            Sets the any policy inhibited flag for the underlying CertPath Provider.
+                            See also RFC 5280, section 6.1.1 (g).
+                            Defaults to false.
+                        </documentation>
+                    </annotation>
+                </attribute>
+            </extension>
+            </complexContent>
+    </complexType>
+    
+    <!-- TRUST ENGINE RELATED OBJECTS -->
+    <element name="TrustEngine" type="sec:TrustEngineType"/>
+    
+    <complexType name="Chaining">
+        <annotation>
+            <documentation>
+                Trust engine which chains together other trust engine instances, evaluating a token
+                against each engine in chain order.
+                
+                If the token to be evaluated can be established as trusted by one member of the chain,
+                then the token is trusted.  Otherwise it is evaluated as untrusted.
+                
+                Trust chain members must all evaluate tokens of a compatible type,
+                for example a Credential or Signature.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <choice minOccurs="1" maxOccurs="unbounded">
+                    <element ref="sec:TrustEngine"/>
+                    <element name="TrustEngineRef">
+                        <annotation>
+                            <documentation>Reference to a trust engine.</documentation>
+                        </annotation>
+                        <complexType>
+                            <attribute name="ref">
+                                <annotation>
+                                    <documentation>Bean reference id for a trust engine declared elsewhere.</documentation>
+                                </annotation>
+                            </attribute>
+                        </complexType>
+                    </element>
+                </choice>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="SignatureChaining">
+        <annotation>
+            <documentation>
+                Trust engine which chains together other signature trust engine instances, evaluating the signature
+                against each engine in chain order.
+                
+                If the signature to be evaluated can be established as trusted by one member of the chain,
+                then the signature is trusted.  Otherwise it is evaluated as untrusted.
+                
+                Trust chain members must all evaluate signatures.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <choice minOccurs="1" maxOccurs="unbounded">
+                    <element ref="sec:TrustEngine"/>
+                    <element name="TrustEngineRef">
+                        <annotation>
+                            <documentation>Reference to a trust engine.</documentation>
+                        </annotation>
+                        <complexType>
+                            <attribute name="ref">
+                                <annotation>
+                                    <documentation>Bean reference id for a trust engine declared elsewhere.</documentation>
+                                </annotation>
+                            </attribute>
+                        </complexType>
+                    </element>
+                </choice>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <!-- Trust engines which use resolvers configured via static information -->
+    <complexType name="StaticExplicitKey">
+        <annotation>
+            <documentation>
+                Trust engine used to validate a key against statically-configured trusted keys.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <sequence>
+                    <element ref="sec:Credential" minOccurs="1" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                A trusted credential to be included in the static trusted credential set.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="StaticPKIXX509Credential">
+        <annotation>
+            <documentation>
+                Trust engine used to validate an X509 credential against statically-configured PKIX information.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <sequence>
+                    <element name="TrustedName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Specifies a trusted name against which the target entity 
+                                certificate's public key must be bound for trust processing to be successful.
+                                
+                                Supported trusted name formats are:
+                                1) Subject DN in RFC 2253 or RFC 1779 format
+                                2) CN component of subject DN
+                                3) Subject alt names (DNS and URI types)
+                                
+                                If multiple instances of this element are present, trust processing
+                                is successful if the target entity certificate matches at least one of them.
+                                
+                                Trusted names are ignored and therefore optional if trustedNameCheckEnabled = false.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element ref="sec:ValidationInfo" minOccurs="1" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                PKIX validation info against which to validate an X509 credential.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element ref="sec:ValidationOptions" minOccurs="0" maxOccurs="1">
+                        <annotation>
+                            <documentation>
+                                Set of options to influence PKIX trust validation processing.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+                <attribute name="trustedNameCheckEnabled" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            If true, the candidate X509Crednetial's certificate must match one of the 
+                            names indicated via the TrustedName child elements.
+                            Defaults to true.
+                        </documentation>
+                    </annotation>
+                </attribute>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="StaticExplicitKeySignature">
+        <annotation>
+            <documentation>
+                Trust engine used to validate a signature against statically-configured trusted keys.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <sequence>
+                    <element ref="sec:Credential" minOccurs="1" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                A trusted credential to be included in the static trusted credential set.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="StaticPKIXSignature">
+        <annotation>
+            <documentation>
+                Trust engine used to validate signatures against statically-configured PKIX information.
+            </documentation>
+        </annotation>
+        <complexContent>
+            <extension base="sec:TrustEngineType">
+                <sequence>
+                    <element name="TrustedName" type="sec:string" minOccurs="0" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                Specifies a trusted name against which the target entity 
+                                certificate's public key must be bound for trust processing to be successful.
+                                
+                                Supported trusted name formats are:
+                                1) Subject DN in RFC 2253 or RFC 1779 format
+                                2) CN component of subject DN
+                                3) Subject alt names (DNS and URI types)
+                                
+                                If multiple instances of this element are present, trust processing
+                                is successful if the target entity certificate matches at least one of them.
+                                
+                                Trusted names are ignored and therefore optional if trustedNameCheckEnabled=false.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element ref="sec:ValidationInfo" minOccurs="1" maxOccurs="unbounded">
+                        <annotation>
+                            <documentation>
+                                PKIX validation info against which to validate a signature.
+                            </documentation>
+                        </annotation>
+                    </element>
+                    <element ref="sec:ValidationOptions" minOccurs="0" maxOccurs="1">
+                        <annotation>
+                            <documentation>
+                                Set of options to influence PKIX trust validation processing.
+                            </documentation>
+                        </annotation>
+                    </element>
+                </sequence>
+                <attribute name="trustedNameCheckEnabled" type="sec:string">
+                    <annotation>
+                        <documentation>
+                            If true, the candidate X509Crednetial's certificate must match one of the 
+                            names indicated via the TrustedName child elements.
+                            Defaults to true.
+                        </documentation>
+                    </annotation>
+                </attribute>
+            </extension>
+        </complexContent>
+    </complexType>
+    
+    <complexType name="TrustEngineType" abstract="true">
+        <attribute name="id" type="sec:string" use="required">
+            <annotation>
+                <documentation>
+                    Unique ID of the trust engine.
+                </documentation>
+            </annotation>
+        </attribute>
+    </complexType>
+
+    <simpleType name="string">
+        <restriction base="string">
+            <minLength value="1"/>
+        </restriction>
+    </simpleType>
+    
+</schema>
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java
new file mode 100644
index 000000000..a8f4f3782
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/AbstractSecurityParserTest.java
@@ -0,0 +1,97 @@
+
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+
+import net.shibboleth.ext.spring.util.ApplicationContextBuilder;
+
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.mock.env.MockPropertySource;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeSuite;
+
+/**
+ * Base mechanics for Security parser tests
+ */
+ at SuppressWarnings("javadoc")
+public class AbstractSecurityParserTest {
+
+    private static final String PATH = "/org/opensaml/spring/";
+    
+    protected static final String SP_ID = "https://sp.example.org/sp/shibboleth"; 
+    protected static final String IDP_ID = "https://idp.example.org/idp/shibboleth";
+    
+    static private String workspaceDirName;
+
+    private GenericApplicationContext pendingTeardownContext = null;
+    
+    @AfterMethod public void tearDownTestContext() {
+        if (null == pendingTeardownContext ) {
+            return;
+        }
+        pendingTeardownContext.close();
+        pendingTeardownContext = null;
+    }
+    
+    protected void setTestContext(final GenericApplicationContext context) {
+        tearDownTestContext();
+        pendingTeardownContext = context;
+    }
+   
+    @BeforeSuite public void setupDirs() throws IOException {
+        final ClassPathResource resource = new ClassPathResource(PATH);
+        workspaceDirName = resource.getFile().getAbsolutePath();
+    }
+
+    protected <T> T getBean(final Class<T> claz, final String... files) throws IOException{
+        return getBean(null, claz, files);
+    }
+
+    protected <T> T getBean(final String name, final Class<T> claz, final String... files) throws IOException{
+        final Resource[] resources = new Resource[files.length];
+        
+        for (int i = 0; i < files.length; i++) {
+            resources[i] = new ClassPathResource(PATH + files[i]);
+        }
+        
+        final ApplicationContextBuilder builder = new ApplicationContextBuilder();
+        
+        builder.setName("ApplicationContext: " + claz);
+        
+        final MockPropertySource mockEnvVars = new MockPropertySource();
+        mockEnvVars.setProperty("DIR", workspaceDirName);
+        builder.setPropertySources(Collections.singletonList(mockEnvVars));
+        
+        builder.setServiceConfigurations(Arrays.asList(resources));
+
+        final GenericApplicationContext context = builder.build();
+        
+        setTestContext(context);
+        
+        if (name != null) {
+            return context.getBean(name, claz);
+        }
+        return context.getBean(claz);
+    }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java
new file mode 100644
index 000000000..d4c93abda
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicInlineParserTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+
+import javax.crypto.SecretKey;
+
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.opensaml.spring.AbstractSecurityParserTest;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing Basic Inline Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class BasicInlineParserTest extends AbstractSecurityParserTest {
+
+    @Test public void publicOnly() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/inlinePublicOnly.xml");
+
+        Assert.assertNull(credential.getPrivateKey());
+    }
+/*    
+    @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+        getBean(Credential.class, true, "credential/inlineWrongCert.xml");
+    }
+  */  
+    @Test public void publicPrivate() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/inlinePublicPrivate.xml");
+        Assert.assertNotNull(credential.getPrivateKey());
+
+    }
+    
+    @Test public void secretBase64() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/secretKeyAESBase64.xml");
+        Assert.assertNotNull(credential.getSecretKey());
+        SecretKey key = credential.getSecretKey();
+        Assert.assertEquals(key.getAlgorithm(), "AES");
+    }
+    
+    @Test public void secretHex() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/secretKeyAESHex.xml");
+        Assert.assertNotNull(credential.getSecretKey());
+        SecretKey key = credential.getSecretKey();
+        Assert.assertEquals(key.getAlgorithm(), "AES");
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java
new file mode 100644
index 000000000..62d09d75e
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicResourceParserTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+
+import javax.crypto.SecretKey;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.BasicCredential;
+import org.opensaml.security.credential.Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing Basic File System and Resource Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class BasicResourceParserTest extends AbstractSecurityParserTest {
+
+    @Test public void publicOnly() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/resourcePublicOnly.xml");
+
+        Assert.assertNull(credential.getPrivateKey());
+    }
+
+    @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+        getBean(Credential.class, "credential/resourceWrongPublic.xml");
+    }
+
+    @Test public void publicPrivate() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/resourcePublicPrivate.xml");
+        Assert.assertNotNull(credential.getPrivateKey());
+
+    }
+    
+    @Test public void secretBase64() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESBase64.xml");
+        Assert.assertNotNull(credential.getSecretKey());
+        SecretKey key = credential.getSecretKey();
+        Assert.assertEquals(key.getAlgorithm(), "AES");
+    }
+    
+    @Test public void secretHex() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESHex.xml");
+        Assert.assertNotNull(credential.getSecretKey());
+        SecretKey key = credential.getSecretKey();
+        Assert.assertEquals(key.getAlgorithm(), "AES");
+    }
+    
+    @Test public void secretBinary() throws IOException {
+        final BasicCredential credential =
+                (BasicCredential) getBean(Credential.class, "credential/resourceSecretAESBinary.xml");
+        Assert.assertNotNull(credential.getSecretKey());
+        SecretKey key = credential.getSecretKey();
+        Assert.assertEquals(key.getAlgorithm(), "AES");
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java
new file mode 100644
index 000000000..adf7a4478
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/BasicX509CredentialFactoryBeanTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.context.support.GenericApplicationContext;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
+import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
+
+/**
+ * Unit test for {@link BasicX509CredentialFactoryBean}.
+ */
+public class BasicX509CredentialFactoryBeanTest {
+
+    @Test public void bean() {
+        final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+            context.setDisplayName("ApplicationContext: X509Credential");
+            final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+                    new SchemaTypeAwareXMLBeanDefinitionReader(context);
+    
+            beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/credential/bean.xml");
+    
+            context.refresh();
+            
+             final BasicX509Credential cred1 = context.getBean("Credential", BasicX509Credential.class);
+            
+             final BasicX509Credential cred2 = context.getBean("EncCredential", BasicX509Credential.class);
+             
+             Assert.assertEquals("http://example.org/enc", cred2.getEntityId()); 
+             
+             final byte[] cb1 = cred1.getPrivateKey().getEncoded();
+             final byte[] cb2 = cred2.getPrivateKey().getEncoded();
+             
+             Assert.assertEquals(cb1.length, cb2.length);
+
+             for (int i = 0; i< cb1.length; i++)Assert.assertEquals(cb1[i], cb2[i]);
+             
+             Assert.assertEquals(cred2.getPublicKey(), cred2.getPublicKey());
+
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java
new file mode 100644
index 000000000..51cfa8e04
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509FilesystemParserTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.UsageType;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing X509 Filesystem Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class X509FilesystemParserTest extends AbstractSecurityParserTest {
+
+    private BasicX509Credential lookup(String file) throws IOException {
+        return (BasicX509Credential) getBean(Credential.class,  "credential/" + file);
+    }
+
+    @Test public void certOnly() throws IOException {
+        final BasicX509Credential credential = lookup("resourceCertOnly.xml");
+
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+                Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+    }
+
+    @Test(expectedExceptions = {BeanCreationException.class,}) public void twoCert() throws IOException {
+        lookup("resourceTwoCert.xml");
+    }
+
+    @Test(expectedExceptions = {BeanCreationException.class,}) public void wrongCert() throws IOException {
+        lookup("resourceWrongCert.xml");
+    }
+
+    @Test public void certKeyCrl() throws IOException {
+        final BasicX509Credential credential = lookup("resourceKeyCertCrl.xml");
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+                Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 3);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+        Assert.assertEquals(credential.getCRLs().size(), 1);
+        Assert.assertEquals(credential.getCRLs().iterator().next().getNextUpdate().getTime(),
+                Instant.parse("2007-09-02T14:14:48Z").toEpochMilli());
+    }
+
+    @Test public void certElementsKeyNames() throws IOException {
+        final BasicX509Credential credential = lookup("resourceCertElementsKeyName.xml");
+
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(),
+                Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+
+        Assert.assertEquals(credential.getUsageType(), UsageType.SIGNING);
+        Assert.assertEquals(credential.getKeyNames().size(), 2);
+        Assert.assertTrue(credential.getKeyNames().contains("Name1"));
+        Assert.assertTrue(credential.getKeyNames().contains("Name2"));
+
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java
new file mode 100644
index 000000000..1565caf4b
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/credential/X509InlineParserTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.credential;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.springframework.beans.factory.BeanCreationException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test parsing X509 Inline Credentials
+ */
+ at SuppressWarnings("javadoc")
+public class X509InlineParserTest extends AbstractSecurityParserTest {
+
+    @Test public void certOnly() throws IOException {
+        final BasicX509Credential credential =
+                (BasicX509Credential) getBean(Credential.class, "credential/inlineCertOnly.xml");
+
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+    }
+    
+    @Test(expectedExceptions={BeanCreationException.class,}) public void wrongCert() throws IOException {
+        getBean(Credential.class, "credential/inlineWrongCert.xml");
+    }
+    
+    @Test public void certKeyCrl() throws IOException {
+        final BasicX509Credential credential =
+                (BasicX509Credential) getBean(Credential.class, "credential/inlineKeyCertCrl.xml");
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 3);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+        Assert.assertEquals(credential.getCRLs().size(), 1);
+        Assert.assertEquals(credential.getCRLs().iterator().next().getNextUpdate().getTime(), Instant.parse("2007-09-02T14:14:48Z").toEpochMilli());
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java
new file mode 100644
index 000000000..22ecba529
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/ChainingTrustEngineTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.trust.impl.ChainingTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+ at SuppressWarnings("javadoc")
+public class ChainingTrustEngineTest extends AbstractSecurityParserTest {
+    
+    private ChainingTrustEngine<?> lookup(String file) throws IOException {
+        return getBean(ChainingTrustEngine.class, "trust/" + file);
+    }
+
+    
+    @Test public void one() throws IOException, SecurityException {
+        final ChainingTrustEngine<?> engine = lookup("chainingTrue.xml");
+        
+        Assert.assertEquals(engine.getChain().size(), 1);
+        Assert.assertTrue(engine.validate(null, null));
+    }
+
+    @Test public void two() throws IOException, SecurityException {
+        final ChainingTrustEngine<?> engine = lookup("chainingTrueFalse.xml");
+        
+        Assert.assertEquals(engine.getChain().size(), 2);
+        Assert.assertTrue(engine.validate(null, null));
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java
new file mode 100644
index 000000000..fc3481353
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/MockTrustEngine.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.trust.TrustEngine;
+
+ at SuppressWarnings("javadoc")
+public class MockTrustEngine<T> implements TrustEngine<T> {
+
+    private final boolean result;
+    
+    /**
+     * Constructor.
+     * 
+     * @param retVal ...
+     */
+    public MockTrustEngine(boolean retVal) {
+        result = retVal;
+    }
+    
+    /** {@inheritDoc} */
+    @Override public boolean validate(T token, CriteriaSet trustBasisCriteria) throws SecurityException {
+        return result;
+    }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java
new file mode 100644
index 000000000..d65a14868
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXFilesystemParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for parsing of filesystem backed ValidationInfo
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXFilesystemParserTest extends AbstractSecurityParserTest {
+
+    private BasicPKIXValidationInformation lookup(String file) throws IOException {
+        return (BasicPKIXValidationInformation) getBean(PKIXValidationInformation.class, "trust/" + file);
+    }
+
+    @Test public void simple() throws IOException {
+        final BasicPKIXValidationInformation info = lookup("resourceValidationInfo.xml");
+        Assert.assertNull(info.getVerificationDepth());
+        Assert.assertTrue(info.getCertificates().isEmpty());
+        Assert.assertTrue(info.getCRLs().isEmpty());
+    }
+    
+    @Test public void complex() throws IOException {
+        final BasicPKIXValidationInformation info = lookup("resourceValidationInfoValues.xml");
+        Assert.assertEquals(info.getVerificationDepth().intValue(), 99);
+        Assert.assertEquals(info.getCertificates().size(), 2);
+        Assert.assertEquals(info.getCRLs().size(), 1);
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java
new file mode 100644
index 000000000..3c87cea9d
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXInlineParserTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for parsing of inline ValidationInfo
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXInlineParserTest extends AbstractSecurityParserTest {
+
+    private BasicPKIXValidationInformation lookup(String file) throws IOException {
+        return (BasicPKIXValidationInformation) getBean(PKIXValidationInformation.class, "trust/" + file);
+    }
+
+    @Test public void simple() throws IOException {
+        final BasicPKIXValidationInformation info = lookup("inlineValidationInfo.xml");
+        Assert.assertNull(info.getVerificationDepth());
+        Assert.assertTrue(info.getCertificates().isEmpty());
+        Assert.assertTrue(info.getCRLs().isEmpty());
+    }
+
+    @Test(enabled=true) public void complex() throws IOException {
+        final BasicPKIXValidationInformation info = lookup("inlineValidationInfoValues.xml");
+        Assert.assertEquals(info.getVerificationDepth().intValue(), 98);
+        Assert.assertEquals(info.getCertificates().size(), 2);
+        Assert.assertEquals(info.getCRLs().size(), 1);
+    }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java
new file mode 100644
index 000000000..c618746cf
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/PKIXValidationOptionsParserTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * Test for {@link PKIXValidationOptionsParser}.
+ */
+ at SuppressWarnings("javadoc")
+public class PKIXValidationOptionsParserTest extends AbstractSecurityParserTest {
+    
+    
+    @Test public void simple() throws IOException {
+        PKIXValidationOptions what = getBean(PKIXValidationOptions.class, "trust/validationOptions.xml");
+
+        Assert.assertTrue(what.isProcessCredentialCRLs());
+        Assert.assertTrue(what.isProcessEmptyCRLs());
+        Assert.assertTrue(what.isProcessExpiredCRLs());
+        Assert.assertEquals(what.getDefaultVerificationDepth(), Integer.valueOf(1));
+    }
+    
+    @Test public void complex() throws IOException {
+        PKIXValidationOptions what = getBean(PKIXValidationOptions.class, "trust/validationOptionsValues.xml");
+
+        Assert.assertFalse(what.isProcessCredentialCRLs());
+        Assert.assertFalse(what.isProcessEmptyCRLs());
+        Assert.assertTrue(what.isProcessExpiredCRLs());
+        Assert.assertEquals(what.getDefaultVerificationDepth(), Integer.valueOf(2));
+    }
+
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java
new file mode 100644
index 000000000..56841da83
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/SignatureChainingParserTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustedCredentialTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.opensaml.xmlsec.signature.support.impl.ChainingSignatureTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for  xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class SignatureChainingParserTest extends AbstractSecurityParserTest {
+ 
+    @Test public void simple() throws IOException, ResolverException {
+        final ChainingSignatureTrustEngine chain =  getBean(ChainingSignatureTrustEngine.class, "trust/chain.xml");
+        
+        Assert.assertEquals(chain.getChain().size(),2);
+        
+        final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) chain.getChain().get(1);
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        
+        BasicX509Credential credential  = (BasicX509Credential) resolver.resolveSingle(null);
+        
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+        
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java
new file mode 100644
index 000000000..ca4503135
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyFactoryBeanTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Iterator;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.Credential;
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.X509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * Test for StaticExplicitKey factory bean.
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeyFactoryBeanTest extends AbstractSecurityParserTest {
+ 
+    static private String TESTPATH = "trust/staticExplicitNative.xml";
+    
+    @Test public void singleKey() throws IOException, ResolverException {
+        final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticKeySingle", TrustEngine.class, TESTPATH);
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        Credential credential  = resolver.resolveSingle(null);
+        
+        Assert.assertNotNull(credential.getPublicKey());
+    }
+    
+    @Test public void singleCert() throws IOException, ResolverException {
+        final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticX509Single", TrustEngine.class, TESTPATH);
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        X509Credential credential  = (X509Credential) resolver.resolveSingle(null);
+        
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+    }
+    
+    @Test public void multipleCert() throws IOException, ResolverException {
+        final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticX509Multiple", TrustEngine.class, TESTPATH);
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        
+        Iterator<Credential> credentials = resolver.resolve(null).iterator();
+        
+        Assert.assertTrue(credentials.hasNext());
+        final X509Credential first = (X509Credential) credentials.next();
+        Assert.assertEquals(first.getEntityCertificateChain().size(), 1);
+
+        Assert.assertTrue(credentials.hasNext());
+        final X509Credential second = (X509Credential) credentials.next();
+        Assert.assertEquals(second.getEntityCertificateChain().size(), 1);
+    }
+
+    @Test public void mixed() throws IOException, ResolverException {
+        final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean("staticMixed", TrustEngine.class, TESTPATH);
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        
+        Iterator<Credential> credentials = resolver.resolve(null).iterator();
+        
+        Assert.assertTrue(credentials.hasNext());
+        final Credential first = credentials.next();
+        Assert.assertNotNull(first.getPublicKey());
+        Assert.assertFalse(first instanceof X509Credential);
+
+        Assert.assertTrue(credentials.hasNext());
+        final X509Credential second = (X509Credential) credentials.next();
+        Assert.assertEquals(second.getEntityCertificateChain().size(), 1);
+        Assert.assertEquals(second.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+    }
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java
new file mode 100644
index 000000000..f0e55e3ae
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeyParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for  xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeyParserTest extends AbstractSecurityParserTest {
+ 
+    @Test public void simple() throws IOException, ResolverException {
+        final ExplicitKeyTrustEngine engine = (ExplicitKeyTrustEngine) getBean(TrustEngine.class, "trust/staticExplicit.xml");
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        
+        BasicX509Credential credential  = (BasicX509Credential) resolver.resolveSingle(null);
+        
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+        
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java
new file mode 100644
index 000000000..a15cb8d3d
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticExplicitKeySignatureParserTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.credential.impl.StaticCredentialResolver;
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.trust.TrustedCredentialTrustEngine;
+import org.opensaml.security.x509.BasicX509Credential;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for  xsi:type="security:StaticExplicitKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticExplicitKeySignatureParserTest extends AbstractSecurityParserTest {
+ 
+    @Test public void simple() throws IOException, ResolverException {
+        final TrustedCredentialTrustEngine<?> engine = (TrustedCredentialTrustEngine<?>) getBean(TrustEngine.class, "trust/staticExplicitSignature.xml");
+        
+        final StaticCredentialResolver resolver = (StaticCredentialResolver) engine.getCredentialResolver();
+        
+        BasicX509Credential credential  = (BasicX509Credential) resolver.resolveSingle(null);
+        
+        Assert.assertEquals(credential.getEntityCertificateChain().size(), 1);
+        Assert.assertTrue(credential.getEntityCertificateChain().contains(credential.getEntityCertificate()));
+
+        Assert.assertEquals(credential.getEntityCertificate().getNotAfter().getTime(), Instant.parse("2024-04-08T13:39:18Z").toEpochMilli());
+        
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java
new file mode 100644
index 000000000..e8fa28717
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXFactoryBeanTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.util.Set;
+
+import org.opensaml.security.SecurityException;
+import org.opensaml.security.x509.PKIXTrustEvaluator;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.security.x509.X509Credential;
+import org.opensaml.security.x509.impl.BasicX509CredentialNameEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.security.x509.impl.X509CredentialNameEvaluator;
+import org.springframework.beans.FatalBeanException;
+import org.springframework.context.support.GenericApplicationContext;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
+import net.shibboleth.ext.spring.util.SchemaTypeAwareXMLBeanDefinitionReader;
+import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
+
+/**
+ * Unit test for {@link StaticPKIXFactoryBean}.
+ */
+public class StaticPKIXFactoryBeanTest {
+
+    @Test
+    public void defaults() {
+        final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+        context.setDisplayName("ApplicationContext: X509Credential");
+        final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+                new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+        beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-defaults.xml");
+
+        context.refresh();
+
+        final PKIXX509CredentialTrustEngine trustEngine = context.getBean("StaticPKIXX509CredentialTrustEngine",
+                PKIXX509CredentialTrustEngine.class);
+        
+        Assert.assertNotNull(trustEngine);
+        
+        Assert.assertTrue(StaticPKIXValidationInformationResolver.class.isInstance((trustEngine.getPKIXResolver())));
+        
+        Assert.assertTrue(CertPathPKIXTrustEvaluator.class.isInstance((trustEngine.getPKIXTrustEvaluator())));
+        
+        Assert.assertTrue(BasicX509CredentialNameEvaluator.class.isInstance((trustEngine.getX509CredentialNameEvaluator())));
+    }
+    
+    @Test
+    public void customPropertiesSuccess() {
+        final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+        context.setDisplayName("ApplicationContext: X509Credential");
+        final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+                new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+        beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-custom-success.xml");
+
+        context.refresh();
+
+        final PKIXX509CredentialTrustEngine trustEngine = context.getBean("StaticPKIXX509CredentialTrustEngine",
+                PKIXX509CredentialTrustEngine.class);
+        
+        Assert.assertNotNull(trustEngine);
+        
+        Assert.assertTrue(StaticPKIXValidationInformationResolver.class.isInstance((trustEngine.getPKIXResolver())));
+        
+        Assert.assertTrue(MockPKIXTrustEvaluator.class.isInstance((trustEngine.getPKIXTrustEvaluator())));
+        
+        Assert.assertTrue(MockX509CredentialNameEvaluator.class.isInstance((trustEngine.getX509CredentialNameEvaluator())));
+    }
+    
+    @Test(expectedExceptions=FatalBeanException.class)
+    public void customPropertiesFailsValidation() {
+        final GenericApplicationContext context = new FilesystemGenericApplicationContext();
+        context.setDisplayName("ApplicationContext: X509Credential");
+        final SchemaTypeAwareXMLBeanDefinitionReader beanDefinitionReader =
+                new SchemaTypeAwareXMLBeanDefinitionReader(context);
+
+        beanDefinitionReader.loadBeanDefinitions("org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml");
+
+        context.refresh();
+    }
+    
+    
+    // 
+    // Helpers
+    //
+    
+    public static class MockPKIXTrustEvaluator extends AbstractInitializableComponent implements PKIXTrustEvaluator {
+
+        /** {@inheritDoc} */
+        public boolean validate(PKIXValidationInformation validationInfo, X509Credential untrustedCredential)
+                throws SecurityException {
+            return false;
+        }
+
+        /** {@inheritDoc} */
+        public PKIXValidationOptions getPKIXValidationOptions() {
+            return null;
+        }
+        
+    }
+    
+    public static class MockX509CredentialNameEvaluator extends AbstractInitializableComponent implements X509CredentialNameEvaluator {
+
+        /** {@inheritDoc} */
+        public boolean evaluate(X509Credential credential, Set<String> trustedNames) throws SecurityException {
+            return false;
+        }
+        
+    }
+}
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java
new file mode 100644
index 000000000..0a5549028
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXSignatureParserTest.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.PKIXValidationOptions;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.opensaml.xmlsec.signature.support.impl.PKIXSignatureTrustEngine;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticPKIXKeySignature".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticPKIXSignatureParserTest extends AbstractSecurityParserTest {
+
+    @Test public void simple() throws IOException, ResolverException {
+        final PKIXSignatureTrustEngine engine =
+                (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIX.xml");
+        
+        Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        Assert.assertTrue(resolver.resolveTrustedNames(null).isEmpty());
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 1);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+        Assert.assertTrue(options.isProcessCredentialCRLs());
+        Assert.assertTrue(options.isProcessEmptyCRLs());
+        Assert.assertTrue(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 1);
+    }
+    
+    @Test public void nameCheckDisabled() throws IOException, ResolverException {
+        final PKIXSignatureTrustEngine engine =
+                (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIX-nameCheckDisabled.xml");
+        
+        Assert.assertNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        Assert.assertTrue(resolver.resolveTrustedNames(null).isEmpty());
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 1);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+        Assert.assertTrue(options.isProcessCredentialCRLs());
+        Assert.assertTrue(options.isProcessEmptyCRLs());
+        Assert.assertTrue(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 1);
+    }
+
+    @Test public void values() throws IOException, ResolverException {
+        final PKIXSignatureTrustEngine engine =
+                (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXValues.xml");
+        
+        Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        final Set<String> tns = resolver.resolveTrustedNames(null);
+        Assert.assertEquals(tns.size(), 3);
+        Assert.assertTrue(tns.contains("Name1"));
+        Assert.assertTrue(tns.contains("Name2"));
+        Assert.assertTrue(tns.contains("Name3"));
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 2);
+        final int firstVal = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+        final int secondVal = ((BasicPKIXValidationInformation) infos.get(1)).getVerificationDepth().intValue();
+
+        Assert.assertTrue((98 == firstVal) || (99 == firstVal));
+        Assert.assertTrue((98 == secondVal) || (99 == secondVal));
+        Assert.assertNotEquals(firstVal, secondVal);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final PKIXValidationOptions options = trustEvaluator.getPKIXValidationOptions();
+        Assert.assertFalse(options.isProcessCredentialCRLs());
+        Assert.assertFalse(options.isProcessEmptyCRLs());
+        Assert.assertFalse(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 2);
+    }
+    
+    @Test public void certPath() throws IOException, ResolverException {
+        final PKIXSignatureTrustEngine engine =
+                (PKIXSignatureTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXValuesCertPathOpts.xml");
+        
+        Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        final Set<String> tns = resolver.resolveTrustedNames(null);
+        Assert.assertEquals(tns.size(), 1);
+        Assert.assertTrue(tns.contains("Name1"));
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 1);
+        final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+        Assert.assertEquals(value, 99);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+        Assert.assertFalse(options.isProcessCredentialCRLs());
+        Assert.assertFalse(options.isProcessEmptyCRLs());
+        Assert.assertFalse(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+        Assert.assertFalse(options.isRevocationEnabled());
+        Assert.assertTrue(options.isAnyPolicyInhibited());
+        Assert.assertTrue(options.isPolicyMappingInhibited());
+        Assert.assertTrue(options.isForceRevocationEnabled());
+        Assert.assertEquals(options.getInitialPolicies().size(), 1);
+        Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java
new file mode 100644
index 000000000..529a7ddc4
--- /dev/null
+++ b/opensaml-spring/src/test/java/org/opensaml/spring/trust/StaticPKIXX509CredentialParserTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.spring.trust;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.opensaml.spring.AbstractSecurityParserTest;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+import org.opensaml.security.trust.TrustEngine;
+import org.opensaml.security.x509.PKIXValidationInformation;
+import org.opensaml.security.x509.impl.BasicPKIXValidationInformation;
+import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
+import org.opensaml.security.x509.impl.CertPathPKIXValidationOptions;
+import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
+import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ * test for xsi:type="security:StaticPKIXX509CredentialParser".
+ */
+ at SuppressWarnings("javadoc")
+public class StaticPKIXX509CredentialParserTest extends AbstractSecurityParserTest {
+
+    @Test public void certPath() throws IOException, ResolverException {
+        final PKIXX509CredentialTrustEngine engine =
+                (PKIXX509CredentialTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXCredentials.xml");
+        
+        Assert.assertNotNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        final Set<String> tns = resolver.resolveTrustedNames(null);
+        Assert.assertEquals(tns.size(), 1);
+        Assert.assertTrue(tns.contains("Name1"));
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 1);
+        final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+        Assert.assertEquals(value, 99);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+        Assert.assertFalse(options.isProcessCredentialCRLs());
+        Assert.assertFalse(options.isProcessEmptyCRLs());
+        Assert.assertFalse(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+        Assert.assertFalse(options.isRevocationEnabled());
+        Assert.assertTrue(options.isAnyPolicyInhibited());
+        Assert.assertTrue(options.isPolicyMappingInhibited());
+        Assert.assertTrue(options.isForceRevocationEnabled());
+        Assert.assertEquals(options.getInitialPolicies().size(), 1);
+        Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+    }
+    
+    @Test public void nameCheckDisabled() throws IOException, ResolverException {
+        final PKIXX509CredentialTrustEngine engine =
+                (PKIXX509CredentialTrustEngine) getBean(TrustEngine.class, "trust/staticPKIXCredentials-nameCheckDisabled.xml");
+        
+        Assert.assertNull(engine.getX509CredentialNameEvaluator());
+
+        final StaticPKIXValidationInformationResolver resolver =
+                (StaticPKIXValidationInformationResolver) engine.getPKIXResolver();
+        final Set<String> tns = resolver.resolveTrustedNames(null);
+        Assert.assertEquals(tns.size(), 0);
+
+        final List<PKIXValidationInformation> infos = new ArrayList<>();
+        for (final PKIXValidationInformation info : resolver.resolve(null)) {
+            infos.add(info);
+        }
+        Assert.assertEquals(infos.size(), 1);
+        final int value = ((BasicPKIXValidationInformation) infos.get(0)).getVerificationDepth().intValue();
+
+        Assert.assertEquals(value, 99);
+
+        final CertPathPKIXTrustEvaluator trustEvaluator = (CertPathPKIXTrustEvaluator) engine.getPKIXTrustEvaluator();
+        final CertPathPKIXValidationOptions options = (CertPathPKIXValidationOptions) trustEvaluator.getPKIXValidationOptions();
+        Assert.assertFalse(options.isProcessCredentialCRLs());
+        Assert.assertFalse(options.isProcessEmptyCRLs());
+        Assert.assertFalse(options.isProcessExpiredCRLs());
+        Assert.assertEquals(options.getDefaultVerificationDepth().intValue(), 3);
+
+        Assert.assertFalse(options.isRevocationEnabled());
+        Assert.assertTrue(options.isAnyPolicyInhibited());
+        Assert.assertTrue(options.isPolicyMappingInhibited());
+        Assert.assertTrue(options.isForceRevocationEnabled());
+        Assert.assertEquals(options.getInitialPolicies().size(), 1);
+        Assert.assertTrue(options.getInitialPolicies().contains("1234"));
+    }
+    
+    
+}
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt
new file mode 100644
index 000000000..fee2306c9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-base64.txt
@@ -0,0 +1 @@
+3MvnCRvjjWgqazN4O2cHCw==
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data
new file mode 100644
index 000000000..a1e00caa9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-binary.data
@@ -0,0 +1 @@
+Z	T�|�T��e�
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt
new file mode 100644
index 000000000..a3c8fef1d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/aes-hex.txt
@@ -0,0 +1 @@
+dccbe7091be38d682a6b33783b67070b
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml
new file mode 100644
index 000000000..9a2d0d2d2
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/bean.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:c="http://www.springframework.org/schema/c"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+                           
+       default-init-method="initialize"
+       default-destroy-method="destroy">
+
+    <bean id="Credential"
+        class="org.opensaml.spring.credential.BasicX509CredentialFactoryBean"
+        p:privateKeyResource="org/opensaml/spring/credential/idp-signing.key"
+        p:certificateResource="org/opensaml/spring/credential/idp-signing.crt"
+        p:entityId="http://example.org/plain" />
+
+    <bean id="EncCredential"
+        class="org.opensaml.spring.credential.BasicX509CredentialFactoryBean"
+        p:privateKeyResource="org/opensaml/spring/credential/idp-signing.key.pass"
+        p:certificateResource="org/opensaml/spring/credential/idp-signing.crt"
+        p:privateKeyPassword="pass"
+        p:entityId="http://example.org/enc" />
+        
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/cert.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem
new file mode 100644
index 000000000..d9e8f8606
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/certificate.pem
@@ -0,0 +1,52 @@
+-----BEGIN CERTIFICATE-----
+MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem
new file mode 100644
index 000000000..f8036cef1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/crl.pem
@@ -0,0 +1,19 @@
+-----BEGIN X509 CRL-----
+MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+s6E8aj6AzPhKyw==
+-----END X509 CRL-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key
new file mode 100644
index 000000000..951462f0d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass
new file mode 100644
index 000000000..cde1772f7
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/idp-signing.key.pass
@@ -0,0 +1,30 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,167811113CA00D40A7A46A79F0133598
+
+lzqV3Xcehk1mnsq4ZRXqiGZXIhYPWA7KqjqJYEHd10JvJoNUwZ7l6VmyZUtny1Xq
+nPPLjWsZ5rOVQkULOX/ZCmXCAW3YgvoIXmdjcenRlZTlbi7vNqongiNGgRleWRlS
+V/E+KrQXlt0jfV1KdW/PDe712mytL7akWoIE39rI0Z78EhD5YfGsA6J6azLmB5zS
+Ffu+wUfND7/gTR3roVlj8Vs1GWxdyNNLI3yUnK6aRd8zO/eTeTcMullSRpT1ORsI
+qhEMfTIBhG+yqC+NhDv1UJ8r8N6jiD63ciKwrt31SOGamdZNRdgxm1sCOcH/akN4
+w9DStPCx809gw46g/ZAi2V2sa0FguS8Jed/LFGwHG/6FVK/nLONzdFIzNF4gZ+B0
+rIPhrdK2kWpEHbMzPZG2KQack9mDv63HNTAJ8Xu1Sf9oHjJyEpdR7bczS+WeZNjd
+YyM6fR7z9n+UWhqa2+2VtAX5KsnNy5BP1SI2h3rVdpW7+hZO74O31Jj6j0QFe0ks
+e20X3ldx/EPJpJunLv46wLsSEoxfuooFj0bxpPEIjb76q9jOXJHr7M+57pdH6Z17
+lPZQ+nCUvUyfIDZ66EfMYpR6nGpYizhpRlvc5U35sU1ZEtngKwJ1rcwFkYD6THKG
+3Y+UVXd9Ft7EbuI7ArB3MOEsOgrw37IvIT3bAI3pvmdezs6H+j5cfb4F7cIGVXWM
+GB00ahK+qNnL0TaC2+qKuGT4bCxeUYkf8fY21JDnIVpZotjeau5qE32AfjWTjPBJ
+RRTyzVvAS3IjeA/LvsMVailUhZTv0sbgudGh14GKp1HWwLQKs4SXAgGCNCNEOaWu
+vKQT2srL5v0d9SBrVhZBi2u1zIiTREy8JIucX2fNvaDPJ9ZJDqxcEVZUnfaXui0u
+y0cinJ5OJQKM99hK6jVimchdJ+viGc4RRZPatkY/ZSiISJwVtrF/VbsAGN45SI+9
+GbAAD4PKOPDxeQ7qMck/OHQAFi3gUDeRsw//13lHOd3KvsWFQIuOcKJPusdU4jJV
+vBUBVtAJxlESJbjfyN1z6vM8mhm5k63apTuSDmzJfU9hMv7eKV7PIhH48RBNqtWl
+atTukx4eex56Jv54u+kKMVZC8AkrCukYrdho+QVdXJ9J0ZqGW0o9BscE4qBpm16K
+/7EL9IfmqZPK5JyxAJPINYeuBu8RPLhbRDFXCr9hMI1VX24O6S3jJWcQmAU8kOki
+UhnYwOUS98cgecyuLmEnzdvogQXFt81jrfFBNLoQ6v/SS1BIJpkDzTWAz+1qjKpR
+1IFdL8omj9SqVPHelUC5s0LKmhI6NLSC/RGFlSaAJ5FcbPTTdaNKH9dDrfQ+yylN
+bINRkbkWBrsVtMdw42Rba4WTSU7iNFQ8/UdNnHOLmfz4yR4x/g++8YusJys4OfD5
+rxr6Y8bAkhO/ebO1ERGmubZQO4AmdLllNXvgfxjY0M4Mpq6DCMLSFfz5Wc+lpX0E
+5ZRDbOBPZcGjJwJKXDDWPAQ95nbHotg/wNy+MeVXylpPgg+NCncdxqikIb/5gx91
+loYi7X4XgaXf6J4VPZDcaQiQul8YLaOk/BCMLopAGIzT+cDxsOi/zKkAICuuMiIn
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml
new file mode 100644
index 000000000..559000881
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineCertOnly.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509Inline">
+	<security:Certificate>
+		MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+		BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+		aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+		MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+		ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+		CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+		x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+		lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+		DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+		J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+		T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+		p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+		0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+		BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+		MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+		BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+		0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+		8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+		1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+		i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+	</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml
new file mode 100644
index 000000000..a0d55070b
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineKeyCertCrl.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509Inline">
+	<security:PrivateKey>
+		MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+		Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+		7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+		rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+		dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+		zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+		UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+		rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+		EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+		lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+		v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+		ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+		UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+		tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+		xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+		tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+		0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+		15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+		JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+		x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+		ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+		5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+		zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+		EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+		LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+	</security:PrivateKey>
+	<security:Certificate>
+		MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+		BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+		V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+		VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+		MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+		MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+		aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+		gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+		AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+		AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+		2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+		zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+		ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+		A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+		Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+		HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+		I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+		6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+	</security:Certificate>
+	<security:Certificate>
+		MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+		MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+		Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+		MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+		dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+		ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+		WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+		oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+		tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+		D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+		OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+		AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+		BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+		Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+		bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+		IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+		aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+		L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+		Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+		LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+		cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+		OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+		ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+		AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+		Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+		GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+		pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+		uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+		ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+		1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+	</security:Certificate>
+	<security:Certificate entityCertificate="true">
+		MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+		BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+		aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+		MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+		ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+		CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+		x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+		lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+		DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+		J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+		T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+		p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+		0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+		BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+		MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+		BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+		0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+		8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+		1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+		i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+	</security:Certificate>
+	<security:CRL>
+		MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+		BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+		ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+		MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+		Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+		MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+		EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+		MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+		dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+		VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+		aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+		RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+		oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+		FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+		T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+		ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+		s6E8aj6AzPhKyw==
+	</security:CRL>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml
new file mode 100644
index 000000000..4fc9f0e7c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicOnly.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicInline">
+	<security:PublicKey>
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+</security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml
new file mode 100644
index 000000000..e270c0edb
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlinePublicPrivate.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicInline">
+	<security:PrivateKey >
+
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGDRPJAA/+0i84
+fz0S1pe5FGfxJjNOPtbVNs1jhW8GahuORGZKSSLiEf3HixCmLrfnCfpa1dM38U02
+aRMrc38uymYFbF9lL6f5xzsjzYTnK8IA9frtCxmCqCCWnZbl28r8WwwwJLpfpJWr
+MEsw/zw16dcrFj4czEyzSxPRQpiHVwASpp2sdEE7rloMFyblrSwFVi30rqmBo4eu
+n/NIhuGdHm0UUuMFu0WS0OkcvcB0YEfc5iJ00YoE7e0ncyzst4pewzT7Rjg/718d
+kg0vZfcTY3oZWcqzk9lOD2w/QW0ikBtib/7MLHtiPURP8SvyYN3q01UZJCyf2znF
+QHAaqfXjAgMBAAECggEAcbqcu/XfOZN1LlpStfio081WCvLGz43iTDnWI+pB4UsZ
+W88Hdm0dLPjr5KSFAQke7fua2oKjciKNFkusiG0ggbwUbdTXywFc0mCII30nbqCA
+HZEjcO/IzHDDlfoU5xYaMGQQUa0loTqf/9gRtac76jHIL6PsMxlWijb4wFgfwsc9
+ekw8U+Fht/XYukdj5Z42Bf956YxOVLKUGWeV+HJIK2ktyBjv6O5iVdpn1jXPftBk
+Fw/rJgtOdclWWFjUpxQuH789SebNWkduTBS//JCIUYWy97VE6nTO0HqwW58ue8Zx
+NrdPU57Nr1lpf/ONsxsaneqNIaiSdLbdTRBmi1EH4QKBgQD0Sa8FgtaARrI6Vk9w
+HApndCvB/2KnfGa25ut/1vIijMR5BMq8eYBS8rl0o3WnArSBNpaTlqr6frge3AnT
+6k7htXfZMkmVX+VrjF3vAd0fn5Llx1CN3+u27HJ6OnkWGpP7HasqJuyQR4UqF+Ag
+iiWmRw0Ugpz3Frf9UE5Y/FXX2QKBgQDPi+XEmEPwJ/3tubmF6aIk+3Z5AwJMYITf
+07hRpjrGLmUg2jJKiHyp3Z7n2eed4bhho2m0dTbeiHTSbrwnHxvvAwWWJD8nn2XE
+CR8/brYSQGp/9U4BVdCj+JoDwdLCrcd/C3nQXgcxAR8Hqp/v8sa8UdNDz5afW6lk
+Zpg/VgCCGwKBgF7cUguY0ATF7yW6KGTHbr7XnLpbmoqhQx2ZNC/TXvlNomnAE532
+rH8JZDzH0MMGyOM4OGadZk2ZcZQCLArPfMwm9KAx5+MKdwM5YayTE7PY+mkh6cT+
+BAFnddjC5gxQS9CCp9nZfZlVPH+o/86C9rXH92tUgPFuMAo86f+iFQ+ZAoGBAKFb
+mp9l4ivsa7dPFbXPFoi6GDms5TSMNcHu0PZpzngVyfnoqgDYbFOEQe7vsutEeh0u
+9xedqbMJVAnmndGslgMUzlsUgyVC/9ORZAHlCRjXi/U/ug2/sh5JQTR6lGlWwis7
+uNEOyXiH7p//P6lFjs0KsL2fvvLWSLQOL3/OVUbRAoGAVdCQ79t/RCzcI49ZSzmc
+fJD+xHSm3HWOsUNKMJ0a8ELs2sOXA0/fz3gQcJROsQeGO0AZXPJlqRno8sA31x/z
+o3VCG852P+hqwvm911bIUrvjHb+a2nn1U5QtoLGedsbgmhJVf3oFLNQVu1GtBt/b
+63lk430rXYg8jGy0yQXaPy4=
+
+	</security:PrivateKey>
+    <security:PublicKey>
+
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+
+    </security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml
new file mode 100644
index 000000000..ec0486538
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/inlineWrongCert.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509Inline">
+	<security:PrivateKey>
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+
+</security:PrivateKey>
+    <security:Certificate>
+MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+</security:Certificate>
+<security:Certificate>
+MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem
new file mode 100644
index 000000000..951462f0d
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/key.pem
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRm
+Skki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX6
+7QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqad
+rHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYi
+dNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+
+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABAoIBAHG6nLv13zmTdS5a
+UrX4qNPNVgryxs+N4kw51iPqQeFLGVvPB3ZtHSz46+SkhQEJHu37mtqCo3IijRZL
+rIhtIIG8FG3U18sBXNJgiCN9J26ggB2RI3DvyMxww5X6FOcWGjBkEFGtJaE6n//Y
+EbWnO+oxyC+j7DMZVoo2+MBYH8LHPXpMPFPhYbf12LpHY+WeNgX/eemMTlSylBln
+lfhySCtpLcgY7+juYlXaZ9Y1z37QZBcP6yYLTnXJVlhY1KcULh+/PUnmzVpHbkwU
+v/yQiFGFsve1ROp0ztB6sFufLnvGcTa3T1Oeza9ZaX/zjbMbGp3qjSGoknS23U0Q
+ZotRB+ECgYEA9EmvBYLWgEayOlZPcBwKZ3Qrwf9ip3xmtubrf9byIozEeQTKvHmA
+UvK5dKN1pwK0gTaWk5aq+n64HtwJ0+pO4bV32TJJlV/la4xd7wHdH5+S5cdQjd/r
+tuxyejp5FhqT+x2rKibskEeFKhfgIIolpkcNFIKc9xa3/VBOWPxV19kCgYEAz4vl
+xJhD8Cf97bm5hemiJPt2eQMCTGCE39O4UaY6xi5lINoySoh8qd2e59nnneG4YaNp
+tHU23oh00m68Jx8b7wMFliQ/J59lxAkfP262EkBqf/VOAVXQo/iaA8HSwq3Hfwt5
+0F4HMQEfB6qf7/LGvFHTQ8+Wn1upZGaYP1YAghsCgYBe3FILmNAExe8luihkx26+
+15y6W5qKoUMdmTQv0175TaJpwBOd9qx/CWQ8x9DDBsjjODhmnWZNmXGUAiwKz3zM
+JvSgMefjCncDOWGskxOz2PppIenE/gQBZ3XYwuYMUEvQgqfZ2X2ZVTx/qP/Ogva1
+x/drVIDxbjAKPOn/ohUPmQKBgQChW5qfZeIr7Gu3TxW1zxaIuhg5rOU0jDXB7tD2
+ac54Fcn56KoA2GxThEHu77LrRHodLvcXnamzCVQJ5p3RrJYDFM5bFIMlQv/TkWQB
+5QkY14v1P7oNv7IeSUE0epRpVsIrO7jRDsl4h+6f/z+pRY7NCrC9n77y1ki0Di9/
+zlVG0QKBgFXQkO/bf0Qs3COPWUs5nHyQ/sR0ptx1jrFDSjCdGvBC7NrDlwNP3894
+EHCUTrEHhjtAGVzyZakZ6PLAN9cf86N1QhvOdj/oasL5vddWyFK74x2/mtp59VOU
+LaCxnnbG4JoSVX96BSzUFbtRrQbf2+t5ZON9K12IPIxstMkF2j8u
+-----END RSA PRIVATE KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem
new file mode 100644
index 000000000..5c4e2e78c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/publicKey.pem
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxg0TyQAP/tIvOH89EtaX
+uRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9x4sQpi635wn6WtXTN/FNNmkTK3N/
+LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgglp2W5dvK/FsMMCS6X6SVqzBLMP88
+NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65aDBcm5a0sBVYt9K6pgaOHrp/zSIbh
+nR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3tJ3Ms7LeKXsM0+0Y4P+9fHZINL2X3
+E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1ET/Er8mDd6tNVGSQsn9s5xUBwGqn1
+4wIDAQAB
+-----END PUBLIC KEY-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml
new file mode 100644
index 000000000..92124520e
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceBasic.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicResourceBacked">
+	<security:PublicKey>%{DIR}/credential/cert.pem</security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml
new file mode 100644
index 000000000..2e29412e9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertElementsKeyName.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked" entityID="https://sp.example.org/sp/shibboleth" usage="Signing" >
+	<security:KeyName>Name1</security:KeyName>
+    <security:KeyName>Name2</security:KeyName>
+	<security:Certificate>%{DIR}/credential/cert.pem</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml
new file mode 100644
index 000000000..7996375d4
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceCertOnly.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked">
+	<security:Certificate>classpath:/org/opensaml/spring/credential/cert.pem</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml
new file mode 100644
index 000000000..be79fa870
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceKeyCertCrl.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked">
+	<security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+    <security:Certificate>%{DIR}/credential/certificate.pem</security:Certificate>
+    <security:Certificate entityCertificate="true">%{DIR}/credential/cert.pem</security:Certificate>
+    <security:CRL>%{DIR}/credential/crl.pem</security:CRL>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml
new file mode 100644
index 000000000..dbdf793fa
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicOnly.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicResourceBacked">
+	<security:PublicKey>classpath:/org/opensaml/spring/credential/publicKey.pem</security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml
new file mode 100644
index 000000000..40c917f27
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourcePublicPrivate.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicResourceBacked">
+	<security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+    <security:PublicKey>%{DIR}/credential/publicKey.pem</security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml
new file mode 100644
index 000000000..693a9e367
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBase64.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="credential" xsi:type="security:BasicResourceBacked">
+	<security:SecretKey algorithm="AES" encoding="base64">classpath:/org/opensaml/spring/credential/aes-base64.txt</security:SecretKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml
new file mode 100644
index 000000000..ea2eed9a8
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESBinary.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="credential" xsi:type="security:BasicResourceBacked">
+	<security:SecretKey algorithm="AES" encoding="binary">classpath:/org/opensaml/spring/credential/aes-binary.data</security:SecretKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml
new file mode 100644
index 000000000..32ca72996
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceSecretAESHex.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="credential" xsi:type="security:BasicResourceBacked">
+	<security:SecretKey algorithm="AES" encoding="hex">classpath:/org/opensaml/spring/credential/aes-hex.txt</security:SecretKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml
new file mode 100644
index 000000000..5c840bf59
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceTwoCert.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked">
+	<security:Certificate entityCertificate="true">%{DIR}/credential/certificate.pem</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml
new file mode 100644
index 000000000..1d90f7fef
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongCert.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked">
+	<security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+    <security:Certificate>%{DIR}/credential/certificate.pem</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml
new file mode 100644
index 000000000..fd37c2e98
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceWrongPublic.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:BasicResourceBacked">
+	<security:PrivateKey>%{DIR}/credential/key.pem</security:PrivateKey>
+    <security:PublicKey>%{DIR}/credential/wrongPublicKey.pem</security:PublicKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml
new file mode 100644
index 000000000..b087dd962
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/resourceX509.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="IdPCredential" xsi:type="security:X509ResourceBacked">
+	<security:Certificate>%{DIR}/credential/cert.pem</security:Certificate>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml
new file mode 100644
index 000000000..6eb1ad98f
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESBase64.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="credential" xsi:type="security:BasicInline">
+    <security:SecretKey algorithm="AES" encoding="base64">
+        3MvnCRvjjWgqazN4O2cHCw==
+    </security:SecretKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml
new file mode 100644
index 000000000..75925e63e
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/secretKeyAESHex.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:Credential xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+	id="credential" xsi:type="security:BasicInline">
+    <security:SecretKey algorithm="AES" encoding="hex">
+        dccbe7091be38d682a6b33783b67070b
+    </security:SecretKey>
+</security:Credential>
+    
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem
new file mode 100644
index 000000000..33164a38a
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/credential/wrongPublicKey.pem
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnMoe4PkMY8RAf7IsMwgDkzjof
+AmTsfGUZDs31aaSFojbbNc8LRQ7yxjgAlb/yeWbSlznTmJCZuCyWDv8nIF6YGPWw
+juk6np4JQ+zs1HabBq6NcG26uJFokh4BfUaOvew77dou+rFQS7Q9apyLibW5zxcd
+AID4+URBBCcH1QgnBwIDAQAB
+-----END PUBLIC KEY-----
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem
new file mode 100644
index 000000000..c0df65bc9
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/cert.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+-----END CERTIFICATE-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml
new file mode 100644
index 000000000..30154f530
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chain.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine 
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+    xsi:type="security:SignatureChaining" id="Chain">
+       <security:TrustEngine id="testBean"
+	xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:ValidationInfo id="PKIXInline"
+		xsi:type="security:PKIXInline" />
+	</security:TrustEngine>
+		<security:TrustEngine id="testBean"
+			xsi:type="security:StaticExplicitKeySignature">
+			<security:Credential id="IdPCredential" xsi:type="security:X509Inline">
+				<security:Certificate>
+					MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+					BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+					aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+					MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+					ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+					CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+					x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+					lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+					DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+					J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+					T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+					p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+					0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+					BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+					MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+					BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+					0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+					8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+					1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+					i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+				</security:Certificate>
+			</security:Credential>
+		</security:TrustEngine>
+</security:TrustEngine>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml
new file mode 100644
index 000000000..5622efcad
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrue.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+    xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd
+                        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+    default-init-method="initialize" default-destroy-method="destroy">
+
+    <security:TrustEngine id="testBean" xsi:type="security:Chaining">
+        <security:TrustEngineRef ref="OneTrue"/> 
+    </security:TrustEngine>
+    
+    <bean id="OneTrue" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="true"/>
+ </beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml
new file mode 100644
index 000000000..7ab5626ed
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/chainingTrueFalse.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+    xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd
+                        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+    default-init-method="initialize" default-destroy-method="destroy">
+
+    <security:TrustEngine id="testBean" xsi:type="security:Chaining">
+        <security:TrustEngineRef ref="OneFalse"/> 
+        <security:TrustEngineRef ref="OneTrue"/> 
+        <security:TrustEngineRef ref="Object"/> 
+    </security:TrustEngine>
+    
+    <bean id="OneFalse" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="false"/>
+    <bean id="OneTrue" class="org.opensaml.spring.trust.MockTrustEngine" c:retVal="true"/>
+    <bean id="Object" class="java.lang.Object"/>
+ </beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem
new file mode 100644
index 000000000..f8036cef1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/crl.pem
@@ -0,0 +1,19 @@
+-----BEGIN X509 CRL-----
+MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+s6E8aj6AzPhKyw==
+-----END X509 CRL-----
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml
new file mode 100644
index 000000000..263193d70
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+    id="PKIXInline" xsi:type="security:PKIXInline"/>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml
new file mode 100644
index 000000000..025db6ed1
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/inlineValidationInfoValues.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+	id="PKIXInlineValues" xsi:type="security:PKIXInline" verifyDepth="98">
+    <security:Certificate>
+        MIIDSTCCArKgAwIBAgIJAKg8tR5hjVM4MA0GCSqGSIb3DQEBBQUAMHcxCzAJBgNV
+        BAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMK
+        V2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYD
+        VQQDEwtleGFtcGxlLm9yZzAeFw0wNzA4MDUxMzA4MDJaFw0xNzA4MDIxMzA4MDJa
+        MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQIExREaXN0cmljdCBvZiBDb2x1bWJpYTET
+        MBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwGA1UEChMVR2VvcmdldG93biBVbml2ZXJz
+        aXR5MRQwEgYDVQQDEwtleGFtcGxlLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+        gYkCgYEA5zKHuD5DGPEQH+yLDMIA5M46HwJk7HxlGQ7N9WmkhaI22zXPC0UO8sY4
+        AJW/8nlm0pc505iQmbgslg7/JyBemBj1sI7pOp6eCUPs7NR2mwaujXBturiRaJIe
+        AX1Gjr3sO+3aLvqxUEu0PWqci4m1uc8XHQCA+PlEQQQnB9UIJwcCAwEAAaOB3DCB
+        2TAdBgNVHQ4EFgQUzEhylzE4wmr4FK1lZ7zjR/KmA24wgakGA1UdIwSBoTCBnoAU
+        zEhylzE4wmr4FK1lZ7zjR/KmA26he6R5MHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQI
+        ExREaXN0cmljdCBvZiBDb2x1bWJpYTETMBEGA1UEBxMKV2FzaGluZ3RvbjEeMBwG
+        A1UEChMVR2VvcmdldG93biBVbml2ZXJzaXR5MRQwEgYDVQQDEwtleGFtcGxlLm9y
+        Z4IJAKg8tR5hjVM4MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAGfkM
+        HUeWzHzsBkwTu+S2vX4gzlJPjiL3RzL40og/qyGz38P4KVg8IQvsGDjs1VFzzcAJ
+        I5ULnSocUOTk5sCTjDKT6VILhgAYJ1jnqIo7Z+VC1r3AS9cSDakzqWTc19EFKxEw
+        6jeBWaqyykdSiVhCAmG5AJsvk+K032zjkWWMo+0=
+    </security:Certificate>
+    <security:Certificate>
+        MIIFmjCCBIKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJVUzEc
+        MBoGA1UEChMTSW5Db21tb24gRmVkZXJhdGlvbjEpMCcGA1UEAxMgSW5Db21tb24g
+        Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwMzMwMjAzNDAwWhcNMTQwMzI5
+        MjAzNDAwWjBWMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTSW5Db21tb24gRmVkZXJh
+        dGlvbjEpMCcGA1UEAxMgSW5Db21tb24gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+        ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRGjKsUM2QAupLAaWx82/C
+        WPalKjKFY8UPmz0T3gf7tJPztTy1Zq8pD0WFRLcQeSBKZGCu8upe8X966b6TZ5yu
+        oUDA754If0DWismuHNoMgRR/l0UvZmPWDGRWd3NBTB8/soLA4EbqFf5Xq8MOJKhP
+        tzcDR33gtaAb3oilZ+ZTpnhTFFrn/qXrAKcSDBpuW2JRpi3xaF/hTPI097oUShOz
+        D1Zj21UYLA6iSFVN+1wlfwilf2KFNK/+zbkCge6wgipZyXxaOAam6ncqmkxy+hy/
+        OiJMmdB+6xkO0xXSBUUcqxJrOcUQhA1vntgb3q5zOJISXhC4RAReA0HyBp/wd0iD
+        AgMBAAGjggJxMIICbTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+        BgNVHQ4EFgQUky3IYRitY+ObZbOd3Y2TuufKY0UwfgYDVR0jBHcwdYAUky3IYRit
+        Y+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNJbkNv
+        bW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0aWZpY2F0aW9u
+        IEF1dGhvcml0eYIBADCBugYIKwYBBQUHAQEEga0wgaowgacGCCsGAQUFBzAChoGa
+        aHR0cDovL2luY29tbW9uY2ExLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdl
+        L2NlcnRzL2NhLWNlcnRzLnA3YgoJCUNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2lu
+        Y29tbW9uY2EyLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvYnJpZGdlL2NlcnRzL2Nh
+        LWNlcnRzLnA3YjCBjQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vaW5jb21tb25j
+        cmwxLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvY3JsL2VlY3Jscy5jcmwwP6A9oDuG
+        OWh0dHA6Ly9pbmNvbW1vbmNybDIuaW5jb21tb25mZWRlcmF0aW9uLm9yZy9jcmwv
+        ZWVjcmxzLmNybDBeBgNVHSAEVzBVMFMGCysGAQQBriMBBAEBMEQwQgYIKwYBBQUH
+        AgEWNmh0dHA6Ly9pbmNvbW1vbmNhLmluY29tbW9uZmVkZXJhdGlvbi5vcmcvcHJh
+        Y3RpY2VzLnBkZjANBgkqhkiG9w0BAQUFAAOCAQEAZfgKUPA+Ky+Ou/vclMlFTMlU
+        GspfbNSdG/fmIq+E/Lv1d2c73Am1zGhOpxgdkM8SE+BPnXW2rl71/N8gaqwgBBxk
+        pwn410siumxlDTwV3HoVFvCGWylNy9o8OE1LyTCqfo8PRwrMzhwcagDgD813BIyj
+        uJg/JQz1LnHMocIW/JligloSIzF1O435/+ckfWXQsmBIhvV5TmA3ZrcycrI1cHGE
+        ZqrCXL0FMZLSr+Vady/tFbVojqI8pSubSMxNkZectePTBjVj1Qeb4hmG8jRv/fwy
+        1Iw6OFH8RKny8nQaO5mOe/fF/swEsMVU9TDpvLIgbhTwnP7Nhfotgaxf5wG8WA==
+    </security:Certificate>
+    <security:CRL>
+        MIIDBjCCAe4CAQEwDQYJKoZIhvcNAQEEBQAwVjELMAkGA1UEBhMCVVMxHDAaBgNV
+        BAoTE0luQ29tbW9uIEZlZGVyYXRpb24xKTAnBgNVBAMTIEluQ29tbW9uIENlcnRp
+        ZmljYXRpb24gQXV0aG9yaXR5Fw0wNzA4MDMxNDE0NDhaFw0wNzA5MDIxNDE0NDha
+        MIHdMBICAQIXDTA0MDMzMTE5NDk0NFowEgIBDhcNMDQwOTE3MTkzMTUxWjASAgEP
+        Fw0wNDA5MTcxOTMyMTRaMBICARYXDTA1MDMyMjE3MTYyMFowEgIBHBcNMDUwMjAx
+        MTkyOTUxWjASAgE+Fw0wNjA0MDcxNjM1MzFaMBICAUAXDTA2MDQwNzE2MzQ1NFow
+        EgIBQRcNMDYwNDEwMTcyMjE1WjASAgFWFw0wNjA3MjAxNzIyMzVaMBICAW8XDTA2
+        MTIxOTIwMTQxMVowEwICAIwXDTA3MDMyOTIxMjE0N1qggYMwgYAwfgYDVR0jBHcw
+        dYAUky3IYRitY+ObZbOd3Y2TuufKY0WhWqRYMFYxCzAJBgNVBAYTAlVTMRwwGgYD
+        VQQKExNJbkNvbW1vbiBGZWRlcmF0aW9uMSkwJwYDVQQDEyBJbkNvbW1vbiBDZXJ0
+        aWZpY2F0aW9uIEF1dGhvcml0eYIBADANBgkqhkiG9w0BAQQFAAOCAQEAeCvRTq70
+        RJxkxgbV+crqhN6oh3k974GGXhOxYDTTGjYbhK8JnCXkt1uJcnGfl1xyqrozoSrl
+        oxoBUmStA8vVqYwtO/FfGpnCyfOG9H2/rAkzbqwr/EXO+MqSd8e1AIJho97i/QSs
+        FWp40h7GeanmiZXL6bc4o9cKb0ROtc1n2nYHkLXptf9bFHte2Z/RhbUr8KaPU4b9
+        T9PW9a2Z7Oc4BDHpEUcljZL0AlO6mGI2RtDB9RdrtRY6M9YQbBwUcV9r+/+ylfZY
+        ugMRDTNUqL72hHKJgmbnfc0CmkcZKHOIGXdGCIX6ewNsLOQnlFAQEVyojQqbzT8w
+        s6E8aj6AzPhKyw==
+    </security:CRL>
+</security:ValidationInfo>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml
new file mode 100644
index 000000000..3ee7a7dbd
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+
+    id="validInfoSimple" xsi:type="security:PKIXResourceBacked"/>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml
new file mode 100644
index 000000000..cd6f56f91
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/resourceValidationInfoValues.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationInfo xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+	id="validInfoValues" xsi:type="security:PKIXResourceBacked" verifyDepth="99">
+	
+	<security:Certificate>%{DIR}/trust/cert.pem</security:Certificate>
+	<security:Certificate>classpath:/org/opensaml/spring/trust/cert.pem</security:Certificate>
+	<security:CRL>%{DIR}/trust/crl.pem</security:CRL>
+</security:ValidationInfo>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml
new file mode 100644
index 000000000..7f0823a8c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:c="http://www.springframework.org/schema/c"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+                           
+       default-init-method="initialize"
+       default-destroy-method="destroy">
+
+    <bean id="StaticPKIXX509CredentialTrustEngine"
+          class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+        <property name="certificates">
+            <list>
+                <value>org/opensaml/spring/credential/idp-signing.crt</value>
+            </list>
+          </property>
+        <property name="trustEvaluator">
+            <bean class="org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator" destroy-method="">
+                <property name="PKIXValidationOptions">
+                    <bean class="org.opensaml.security.x509.impl.CertPathPKIXValidationOptions"
+                        p:forceRevocationEnabled="true"
+                        p:revocationEnabled="true"
+                        destroy-method="" />
+                </property>
+            </bean>
+        </property>
+    </bean>
+        
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml
new file mode 100644
index 000000000..22e93f04c
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-custom-success.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:c="http://www.springframework.org/schema/c"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+                           
+       default-init-method="initialize"
+       default-destroy-method="destroy">
+
+    <bean id="StaticPKIXX509CredentialTrustEngine"
+          class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+        <property name="certificates">
+            <list>
+                <value>org/opensaml/spring/credential/idp-signing.crt</value>
+            </list>
+          </property>
+        <property name="trustEvaluator">
+            <bean class="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.MockPKIXTrustEvaluator" />
+        </property>
+        <property name="credentialNameEvaluator">
+            <bean class="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.MockX509CredentialNameEvaluator" />
+        </property>
+    </bean>
+        
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml
new file mode 100644
index 000000000..cf186faec
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/static-pkix-factory-defaults.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:c="http://www.springframework.org/schema/c"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+                           
+       default-init-method="initialize"
+       default-destroy-method="destroy">
+
+    <bean id="StaticPKIXX509CredentialTrustEngine"
+          class="org.opensaml.spring.trust.StaticPKIXFactoryBean">
+        <property name="certificates">
+            <list>
+                <value>org/opensaml/spring/credential/idp-signing.crt</value>
+            </list>
+          </property>
+    </bean>
+        
+</beans>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml
new file mode 100644
index 000000000..ec84d9966
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicit.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticExplicitKey" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:Credential id="InLineBean" xsi:type="security:X509Inline">
+		<security:Certificate>
+			MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+			BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+			aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+			MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+			ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+			CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+			x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+			lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+			DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+			J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+			T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+			p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+			0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+			BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+			MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+			BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+			0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+			8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+			1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+			i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+		</security:Certificate>
+	</security:Credential>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml
new file mode 100644
index 000000000..655606a74
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitNative.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+	xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
+	default-init-method="initialize" default-destroy-method="destroy">
+
+    <bean id="staticKeySingle"
+        class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+        p:publicKeys="classpath:/org/opensaml/spring/credential/publicKey.pem" />
+
+    <bean id="staticX509Single"
+        class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+        p:certificates="classpath:/org/opensaml/spring/credential/cert.pem" />
+
+    <bean id="staticX509Multiple"
+        class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+        p:certificates="classpath:/org/opensaml/spring/credential/certificate.pem" />
+
+    <bean id="staticMixed"
+        class="org.opensaml.spring.trust.StaticExplicitKeyFactoryBean"
+        p:publicKeys="classpath:/org/opensaml/spring/credential/publicKey.pem"
+        p:certificates="classpath:/org/opensaml/spring/credential/cert.pem" />
+
+</beans>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml
new file mode 100644
index 000000000..2fbaec963
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticExplicitSignature.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticExplicitKeySignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:Credential id="InLineBean" xsi:type="security:X509Inline">
+		<security:Certificate>
+			MIIDtTCCAp2gAwIBAgIJAPmsD+VGldyPMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
+			BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
+			aWRnaXRzIFB0eSBMdGQwHhcNMTQwNDExMTMzOTE4WhcNMjQwNDA4MTMzOTE4WjBF
+			MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
+			ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+			CgKCAQEAxg0TyQAP/tIvOH89EtaXuRRn8SYzTj7W1TbNY4VvBmobjkRmSkki4hH9
+			x4sQpi635wn6WtXTN/FNNmkTK3N/LspmBWxfZS+n+cc7I82E5yvCAPX67QsZgqgg
+			lp2W5dvK/FsMMCS6X6SVqzBLMP88NenXKxY+HMxMs0sT0UKYh1cAEqadrHRBO65a
+			DBcm5a0sBVYt9K6pgaOHrp/zSIbhnR5tFFLjBbtFktDpHL3AdGBH3OYidNGKBO3t
+			J3Ms7LeKXsM0+0Y4P+9fHZINL2X3E2N6GVnKs5PZTg9sP0FtIpAbYm/+zCx7Yj1E
+			T/Er8mDd6tNVGSQsn9s5xUBwGqn14wIDAQABo4GnMIGkMB0GA1UdDgQWBBSiQhSu
+			p9BYjD2ZuMkEiQK7w/Zq0TB1BgNVHSMEbjBsgBSiQhSup9BYjD2ZuMkEiQK7w/Zq
+			0aFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
+			BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPmsD+VGldyPMAwGA1UdEwQF
+			MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAHZmIo9GBTSsD5DJfKkCVUvBafwR089H
+			BkgVPOuVuEe803BRlKd4BVIsuxAUAy3oqdJYqf9ptPEx8Ef+ALbcDhRbWINhMgO7
+			0/S4x3pS9gOn7/Y9yZplOe4Jd2q3R8QBef+hKLcD/Uv0Sqy2nilM8BnMga5tqsL+
+			8oFt0blzXtQ2vcOVyNyG326uZBZv2Cf6FXFsYQX1L/tLeTBJegefgGkg2dqCTKIU
+			1Qy/Kd2P3/S01kQxjDeG7UfXc9qtelJ68kvzK2d3WOJ2qmsdMxjMNfTItP7FO54M
+			i8V7gp9HK+EimdSbgu7xktKlrqA2Rsn+dBoPSgOUs/LOGtCS9/biF0w=
+		</security:Certificate>
+	</security:Credential>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml
new file mode 100644
index 000000000..a67e5bdba
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX-nameCheckDisabled.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean" trustedNameCheckEnabled="false"
+	xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:ValidationInfo id="PKIXInline"
+		xsi:type="security:PKIXInline" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml
new file mode 100644
index 000000000..c32778780
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIX.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:ValidationInfo id="PKIXInline"
+		xsi:type="security:PKIXInline" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml
new file mode 100644
index 000000000..10468c5d4
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials-nameCheckDisabled.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean" trustedNameCheckEnabled="false"
+	xsi:type="security:StaticPKIXX509Credential" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:ValidationInfo id="PKIXFS"
+		xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+	<security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+		processCredentialCRLs="false" processExpiredCRLs="false"
+		processEmptyCRLs="false" defaultVerificationDepth="3"
+		anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+		 >
+		 <security:PolicyOID>1234
+		 </security:PolicyOID><security:PolicyOID>       
+		 
+		 </security:PolicyOID>
+		 </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml
new file mode 100644
index 000000000..552f3ac82
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXCredentials.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticPKIXX509Credential" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:TrustedName>Name1</security:TrustedName>
+	<security:ValidationInfo id="PKIXFS"
+		xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+	<security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+		processCredentialCRLs="false" processExpiredCRLs="false"
+		processEmptyCRLs="false" defaultVerificationDepth="3"
+		anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+		 >
+		 <security:PolicyOID>1234
+		 </security:PolicyOID><security:PolicyOID>       
+		 
+		 </security:PolicyOID>
+		 </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml
new file mode 100644
index 000000000..19dc58de5
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValues.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:TrustedName>Name1</security:TrustedName>
+	<security:TrustedName>Name2</security:TrustedName>
+	<security:TrustedName>Name3</security:TrustedName>
+	<security:ValidationInfo id="PKIXFS"
+		xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+	<security:ValidationInfo id="PKIXIL"
+		xsi:type="security:PKIXInline" verifyDepth="98" />
+	<security:ValidationOptions
+		processCredentialCRLs="false" processExpiredCRLs="false"
+		processEmptyCRLs="false" defaultVerificationDepth="2" />
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml
new file mode 100644
index 000000000..deacbff09
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/staticPKIXValuesCertPathOpts.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:TrustEngine id="testBean"
+	xsi:type="security:StaticPKIXSignature" xmlns:security="urn:mace:shibboleth:2.0:security"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd">
+	<security:TrustedName>Name1</security:TrustedName>
+	<security:ValidationInfo id="PKIXFS"
+		xsi:type="security:PKIXResourceBacked" verifyDepth="99" />
+	<security:ValidationOptions xsi:type="security:CertPathValidationOptionsType"
+		processCredentialCRLs="false" processExpiredCRLs="false"
+		processEmptyCRLs="false" defaultVerificationDepth="3"
+		anyPolicyInhibit="true" policyMappingInhibit="true" forceRevocationEnabled="true" revocationEnabled="false"
+		 >
+		 <security:PolicyOID>1234
+		 </security:PolicyOID><security:PolicyOID>       
+		 
+		 </security:PolicyOID>
+		 </security:ValidationOptions>
+</security:TrustEngine>
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml
new file mode 100644
index 000000000..eb36a831b
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptions.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationOptions
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"/>
\ No newline at end of file
diff --git a/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml
new file mode 100644
index 000000000..7ec42ed68
--- /dev/null
+++ b/opensaml-spring/src/test/resources/org/opensaml/spring/trust/validationOptionsValues.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<security:ValidationOptions
+    xmlns:security="urn:mace:shibboleth:2.0:security"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd"
+    
+    processCredentialCRLs="false" processExpiredCRLs="true" processEmptyCRLs="false" defaultVerificationDepth="2"/>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/Default suite/Default test.html b/opensaml-spring/test-output/Default suite/Default test.html
new file mode 100644
index 000000000..d9e7f5982
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/Default test.html	
@@ -0,0 +1,875 @@
+<html>
+<head>
+<title>TestNG:  Default test</title>
+<link href="../testng.css" rel="stylesheet" type="text/css" />
+<link href="../my-testng.css" rel="stylesheet" type="text/css" />
+
+<style type="text/css">
+.log { display: none;} 
+.stack-trace { display: none;} 
+</style>
+<script type="text/javascript">
+<!--
+function flip(e) {
+  current = e.style.display;
+  if (current == 'block') {
+    e.style.display = 'none';
+    return 0;
+  }
+  else {
+    e.style.display = 'block';
+    return 1;
+  }
+}
+
+function toggleBox(szDivId, elem, msg1, msg2)
+{
+  var res = -1;  if (document.getElementById) {
+    res = flip(document.getElementById(szDivId));
+  }
+  else if (document.all) {
+    // this is the way old msie versions work
+    res = flip(document.all[szDivId]);
+  }
+  if(elem) {
+    if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;
+  }
+
+}
+
+function toggleAllBoxes() {
+  if (document.getElementsByTagName) {
+    d = document.getElementsByTagName('div');
+    for (i = 0; i < d.length; i++) {
+      if (d[i].className == 'log') {
+        flip(d[i]);
+      }
+    }
+  }
+}
+
+// -->
+</script>
+
+</head>
+<body>
+<h2 align='center'>Default test</h2><table border='1' align="center">
+<tr>
+<td>Tests passed/Failed/Skipped:</td><td>43/0/0</td>
+</tr><tr>
+<td>Started on:</td><td>Wed Jun 08 10:36:14 EDT 2022</td>
+</tr>
+<tr><td>Total time:</td><td>2 seconds (2631 ms)</td>
+</tr><tr>
+<td>Included groups:</td><td></td>
+</tr><tr>
+<td>Excluded groups:</td><td></td>
+</tr>
+</table><p/>
+<small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table width='100%' border='1' class='invocation-passed'>
+<tr><td colspan='4' align='center'><b>PASSED TESTS</b></td></tr>
+<tr><td><b>Test method</b></td>
+<td width="30%"><b>Exception</b></td>
+<td width="10%"><b>Time (seconds)</b></td>
+<td><b>Instance</b></td>
+</tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXValidationOptionsParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXInlineParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.mixed()'><b>mixed</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.twoCert()'><b>twoCert</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1074844820", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1074844820'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXFilesystemParserTest.complex()'><b>complex</b><br>Test class: org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.publicPrivate()'><b>publicPrivate</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.values()'><b>values</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.ChainingTrustEngineTest.one()'><b>one</b><br>Test class: org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1967617997", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1967617997'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.singleKey()'><b>singleKey</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.certKeyCrl()'><b>certKeyCrl</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretHex()'><b>secretHex</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()'><b>customPropertiesFailsValidation</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 38 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1366212088", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1366212088'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both  [...]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 38 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretBinary()'><b>secretBinary</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.certPath()'><b>certPath</b><br>Test class: org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.nameCheckDisabled()'><b>nameCheckDisabled</b><br>Test class: org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certKeyCrl()'><b>certKeyCrl</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.certPath()'><b>certPath</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.bean()'><b>bean</b><br>Test class: org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXValidationOptionsParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXSignatureParserTest.nameCheckDisabled()'><b>nameCheckDisabled</b><br>Test class: org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.multipleCert()'><b>multipleCert</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.secretHex()'><b>secretHex</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certOnly()'><b>certOnly</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXInlineParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.publicOnly()'><b>publicOnly</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.ChainingTrustEngineTest.two()'><b>two</b><br>Test class: org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.secretBase64()'><b>secretBase64</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicResourceParserTest.publicPrivate()'><b>publicPrivate</b><br>Test class: org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 51 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1671811074", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1671811074'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 51 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.wrongCert()'><b>wrongCert</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td><div><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</pre></div><a href='#' onClick='toggleBox("stack-trace1264701638", this, "Click to show all stack frames", "Click to hide stack frames")'>Click to show all stack frames</a>
+<div class='stack-trace' id='stack-trace1264701638'><pre>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</pre></div></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.publicOnly()'><b>publicOnly</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509FilesystemParserTest.certElementsKeyNames()'><b>certElementsKeyNames</b><br>Test class: org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.SignatureChainingParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.SignatureChainingParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.BasicInlineParserTest.secretBase64()'><b>secretBase64</b><br>Test class: org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.defaults()'><b>defaults</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+<tr>
+<td title='org.opensaml.spring.credential.X509InlineParserTest.certOnly()'><b>certOnly</b><br>Test class: org.opensaml.spring.credential.X509InlineParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.PKIXFilesystemParserTest.simple()'><b>simple</b><br>Test class: org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.singleCert()'><b>singleCert</b><br>Test class: org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b</td></tr>
+<tr>
+<td title='org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesSuccess()'><b>customPropertiesSuccess</b><br>Test class: org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td></td>
+<td>0</td>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c</td></tr>
+</table><p>
+</body>
+</html>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/Default suite/Default test.xml b/opensaml-spring/test-output/Default suite/Default test.xml
new file mode 100644
index 000000000..b1ec180e6
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/Default test.xml	
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitXMLReporter -->
+<testsuite ignored="14" hostname="Silver-Machine.local" failures="0" tests="43" name="Default test" time="2.631" errors="0" timestamp="2022-06-08T10:36:17 EDT">
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicOnly" time="0.639"/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicPrivate" time="0.113"/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBase64" time="0.048"/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBinary" time="0.057"/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretHex" time="0.028"/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="wrongCert" time="0.068"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="mixed" time="0.124"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="multipleCert" time="0.051"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleCert" time="0.062"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleKey" time="0.055"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyParserTest" name="simple" time="0.065"/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" name="simple" time="0.044"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="complex" time="0.029"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="simple" time="0.019"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="complex" time="0.048"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="simple" time="0.022"/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certElementsKeyNames" time="0.028"/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certKeyCrl" time="0.045"/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certOnly" time="0.013"/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="twoCert" time="0.063"/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="wrongCert" time="0.066"/>
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certKeyCrl" time="0.049"/>
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certOnly" time="0.027"/>
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="wrongCert" time="0.031"/>
+  <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="one" time="0.059"/>
+  <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="two" time="0.038"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="certPath" time="0.067"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="nameCheckDisabled" time="0.036"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesFailsValidation" time="0.051"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesSuccess" time="0.025"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="defaults" time="0.015"/>
+  <testcase classname="org.opensaml.spring.trust.SignatureChainingParserTest" name="simple" time="0.036"/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicOnly" time="0.021"/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicPrivate" time="0.035"/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretBase64" time="0.017"/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretHex" time="0.015"/>
+  <testcase classname="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" name="bean" time="0.073"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="complex" time="0.021"/>
+  <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="simple" time="0.021"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="certPath" time="0.02"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="nameCheckDisabled" time="0.022"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="simple" time="0.02"/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="values" time="0.044"/>
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+  <testcase classname="org.opensaml.spring.AbstractSecurityParserTest" name="@BeforeSuite setupDirs" time="0.0">
+    <ignored/>
+  </testcase> <!-- @BeforeSuite setupDirs -->
+</testsuite> <!-- Default test -->
diff --git a/opensaml-spring/test-output/Default suite/testng-failed.xml b/opensaml-spring/test-output/Default suite/testng-failed.xml
new file mode 100644
index 000000000..071c33d5e
--- /dev/null
+++ b/opensaml-spring/test-output/Default suite/testng-failed.xml	
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Failed suite [Default suite]" guice-stage="DEVELOPMENT">
+  <test thread-count="5" name="Default test(failed)">
+    <classes>
+      <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+        <methods>
+          <include name="setupDirs"/>
+          <include name="tearDownTestContext"/>
+          <include name="complex"/>
+        </methods>
+      </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+    </classes>
+  </test> <!-- Default test(failed) -->
+</suite> <!-- Failed suite [Default suite] -->
diff --git a/opensaml-spring/test-output/bullet_point.png b/opensaml-spring/test-output/bullet_point.png
new file mode 100644
index 000000000..176e6d5b3
Binary files /dev/null and b/opensaml-spring/test-output/bullet_point.png differ
diff --git a/opensaml-spring/test-output/collapseall.gif b/opensaml-spring/test-output/collapseall.gif
new file mode 100644
index 000000000..a2d80a904
Binary files /dev/null and b/opensaml-spring/test-output/collapseall.gif differ
diff --git a/opensaml-spring/test-output/emailable-report.html b/opensaml-spring/test-output/emailable-report.html
new file mode 100644
index 000000000..c2ab84eb2
--- /dev/null
+++ b/opensaml-spring/test-output/emailable-report.html
@@ -0,0 +1,348 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="https://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+<title>TestNG Report</title>
+<style type="text/css">table {margin-bottom:10px;border-collapse:collapse;empty-cells:show}th,td {border:1px solid #009;padding:.25em .5em}th {vertical-align:bottom}td {vertical-align:top}table a {font-weight:bold}.stripe td {background-color: #E6EBF9}.num {text-align:right}.passedodd td {background-color: #3F3}.passedeven td {background-color: #0A0}.skippedodd td {background-color: #DDD}.skippedeven td {background-color: #CCC}.failedodd td,.attn {background-color: #F33}.failedeven td,.s [...]
+</head>
+<body>
+<table>
+<tr><th>Test</th><th># Passed</th><th># Skipped</th><th># Retried</th><th># Failed</th><th>Time (ms)</th><th>Included Groups</th><th>Excluded Groups</th></tr>
+<tr><th colspan="8">Default suite</th></tr>
+<tr><td><a href="#t0">Default test</a></td><td class="num">43</td><td class="num">0</td><td class="num">0</td><td class="num">0</td><td class="num">2,631</td><td></td><td></td></tr>
+</table>
+<table id='summary'><thead><tr><th>Class</th><th>Method</th><th>Start</th><th>Time (ms)</th></tr></thead><tbody><tr><th colspan="4">Default suite</th></tr></tbody><tbody id="t0"><tr><th colspan="4">Default test — passed</th></tr><tr class="passedeven"><td rowspan="4">org.opensaml.spring.credential.BasicInlineParserTest</td><td><a href="#m0">publicOnly</a></td><td rowspan="1">1654698976731</td><td rowspan="1">21</td></tr><tr class="passedeven"><td><a href="#m1">publicPrivate</a></td [...]
+</table>
+<h2>Default test</h2><h3 id="m0">org.opensaml.spring.credential.BasicInlineParserTest#publicOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m1">org.opensaml.spring.credential.BasicInlineParserTest#publicPrivate</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m2">org.opensaml.spring.credential.BasicInlineParserTest#secretBase64</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m3">org.opensaml.spring.credential.BasicInlineParserTest#secretHex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m4">org.opensaml.spring.credential.BasicResourceParserTest#publicOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m5">org.opensaml.spring.credential.BasicResourceParserTest#publicPrivate</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m6">org.opensaml.spring.credential.BasicResourceParserTest#secretBase64</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m7">org.opensaml.spring.credential.BasicResourceParserTest#secretBinary</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m8">org.opensaml.spring.credential.BasicResourceParserTest#secretHex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m9">org.opensaml.spring.credential.BasicResourceParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+	at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m10">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest#bean</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m11">org.opensaml.spring.credential.X509FilesystemParserTest#certElementsKeyNames</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m12">org.opensaml.spring.credential.X509FilesystemParserTest#certKeyCrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m13">org.opensaml.spring.credential.X509FilesystemParserTest#certOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m14">org.opensaml.spring.credential.X509FilesystemParserTest#twoCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+	at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m15">org.opensaml.spring.credential.X509FilesystemParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+	at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 51 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m16">org.opensaml.spring.credential.X509InlineParserTest#certKeyCrl</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m17">org.opensaml.spring.credential.X509InlineParserTest#certOnly</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m18">org.opensaml.spring.credential.X509InlineParserTest#wrongCert</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+	at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+	at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+	at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+	at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+	at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+	at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+	at java.base/java.security.Signature.verify(Signature.java:789)
+	at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+	... 50 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m19">org.opensaml.spring.trust.ChainingTrustEngineTest#one</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m20">org.opensaml.spring.trust.ChainingTrustEngineTest#two</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m21">org.opensaml.spring.trust.PKIXFilesystemParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m22">org.opensaml.spring.trust.PKIXFilesystemParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m23">org.opensaml.spring.trust.PKIXInlineParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m24">org.opensaml.spring.trust.PKIXInlineParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m25">org.opensaml.spring.trust.PKIXValidationOptionsParserTest#complex</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m26">org.opensaml.spring.trust.PKIXValidationOptionsParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m27">org.opensaml.spring.trust.SignatureChainingParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m28">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#mixed</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m29">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#multipleCert</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m30">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#singleCert</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m31">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest#singleKey</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m32">org.opensaml.spring.trust.StaticExplicitKeyParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m33">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m34">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#customPropertiesFailsValidation</h3><table class="result"><tr><th>Expected Exception</th></tr><tr><td><div class="stacktrace">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.s [...]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at org.testng.TestRunner.privateRun(TestRunner.java:808)
+	at org.testng.TestRunner.run(TestRunner.java:603)
+	at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+	at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+	at org.testng.TestNG.runSuites(TestNG.java:1092)
+	at org.testng.TestNG.run(TestNG.java:1060)
+	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+	at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+	at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+	... 38 more
+</div></td></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m35">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#customPropertiesSuccess</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m36">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest#defaults</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m37">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#certPath</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m38">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#nameCheckDisabled</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m39">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#simple</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m40">org.opensaml.spring.trust.StaticPKIXSignatureParserTest#values</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m41">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest#certPath</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+<h3 id="m42">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest#nameCheckDisabled</h3><table class="result"><tr><th class="invisible"/></tr></table><p class="totop"><a href="#summary">back to summary</a></p>
+</body>
+</html>
diff --git a/opensaml-spring/test-output/failed.png b/opensaml-spring/test-output/failed.png
new file mode 100644
index 000000000..c117be59a
Binary files /dev/null and b/opensaml-spring/test-output/failed.png differ
diff --git a/opensaml-spring/test-output/index.html b/opensaml-spring/test-output/index.html
new file mode 100644
index 000000000..baf493101
--- /dev/null
+++ b/opensaml-spring/test-output/index.html
@@ -0,0 +1,1515 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+  <meta charset='utf-8'>
+  <title>TestNG reports</title>
+
+    <link type="text/css" href="testng-reports1.css" rel="stylesheet" id="ultra" />
+    <link type="text/css" href="testng-reports.css" rel="stylesheet" id="retro" disabled="false"/>
+    <script type="text/javascript" src="jquery.min.js"></script>
+    <script type="text/javascript" src="testng-reports.js"></script>
+    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+    <script type='text/javascript'>
+      google.load('visualization', '1', {packages:['table']});
+      google.setOnLoadCallback(drawTable);
+      var suiteTableInitFunctions = new Array();
+      var suiteTableData = new Array();
+    </script>
+    <!--
+      <script type="text/javascript" src="jquery-ui/js/jquery-ui-1.8.16.custom.min.js"></script>
+     -->
+  </head>
+
+  <body>
+    <div class="top-banner-root">
+      <span class="top-banner-title-font">Test results</span>
+      <button id="button" class="button">Switch Retro Theme</button> <!-- button -->
+      <br/>
+      <span class="top-banner-font-1">1 suite</span>
+    </div> <!-- top-banner-root -->
+    <div class="navigator-root">
+      <div class="navigator-suite-header">
+        <span>All suites</span>
+        <a href="#" title="Collapse/expand all the suites" class="collapse-all-link">
+          <img src="collapseall.gif" class="collapse-all-icon">
+          </img> <!-- collapse-all-icon -->
+        </a> <!-- collapse-all-link -->
+      </div> <!-- navigator-suite-header -->
+      <div class="suite">
+        <div class="rounded-window">
+          <div class="suite-header light-rounded-window-top">
+            <a href="#" panel-name="suite-Default_suite" class="navigator-link">
+              <span class="suite-name border-passed">Default suite</span>
+            </a> <!-- navigator-link -->
+          </div> <!-- suite-header light-rounded-window-top -->
+          <div class="navigator-suite-content">
+            <div class="suite-section-title">
+              <span>Info</span>
+            </div> <!-- suite-section-title -->
+            <div class="suite-section-content">
+              <ul>
+                <li>
+                  <a href="#" panel-name="test-xml-Default_suite" class="navigator-link ">
+                    <span>testng-customsuite.xml</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="testlist-Default_suite" class="navigator-link ">
+                    <span class="test-stats">1 test</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="group-Default_suite" class="navigator-link ">
+                    <span>0 groups</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="times-Default_suite" class="navigator-link ">
+                    <span>Times</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="reporter-Default_suite" class="navigator-link ">
+                    <span>Reporter output</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="ignored-methods-Default_suite" class="navigator-link ">
+                    <span>Ignored methods</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+                <li>
+                  <a href="#" panel-name="chronological-Default_suite" class="navigator-link ">
+                    <span>Chronological view</span>
+                  </a> <!-- navigator-link  -->
+                </li>
+              </ul>
+            </div> <!-- suite-section-content -->
+            <div class="result-section">
+              <div class="suite-section-title">
+                <span>Results</span>
+              </div> <!-- suite-section-title -->
+              <div class="suite-section-content">
+                <ul>
+                  <li>
+                    <span class="method-stats">43 methods,   43 passed</span>
+                  </li>
+                  <li>
+                    <span class="method-list-title passed">Passed methods</span>
+                    <span class="show-or-hide-methods passed">
+                      <a href="#" panel-name="suite-Default_suite" class="hide-methods passed suite-Default_suite"> (hide)</a> <!-- hide-methods passed suite-Default_suite -->
+                      <a href="#" panel-name="suite-Default_suite" class="show-methods passed suite-Default_suite"> (show)</a> <!-- show-methods passed suite-Default_suite -->
+                    </span>
+                    <div class="method-list-content passed suite-Default_suite">
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" class="method navigator-link" hash-for-method="bean">bean</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certElementsKeyNames">certElementsKeyNames</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="certKeyCrl">certKeyCrl</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certKeyCrl">certKeyCrl</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="certOnly">certOnly</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="certOnly">certOnly</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" class="method navigator-link" hash-for-method="certPath">certPath</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="certPath">certPath</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXInlineParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXFilesystemParserTest" class="method navigator-link" hash-for-method="complex">complex</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="customPropertiesFailsValidation">customPropertiesFailsValidation</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="customPropertiesSuccess">customPropertiesSuccess</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" class="method navigator-link" hash-for-method="defaults">defaults</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="mixed">mixed</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="multipleCert">multipleCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" class="method navigator-link" hash-for-method="nameCheckDisabled">nameCheckDisabled</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="nameCheckDisabled">nameCheckDisabled</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.ChainingTrustEngineTest" class="method navigator-link" hash-for-method="one">one</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="publicOnly">publicOnly</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="publicOnly">publicOnly</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="publicPrivate">publicPrivate</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="publicPrivate">publicPrivate</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretBase64">secretBase64</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="secretBase64">secretBase64</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretBinary">secretBinary</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="secretHex">secretHex</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicInlineParserTest" class="method navigator-link" hash-for-method="secretHex">secretHex</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXInlineParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.SignatureChainingParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.PKIXFilesystemParserTest" class="method navigator-link" hash-for-method="simple">simple</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="singleCert">singleCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" class="method navigator-link" hash-for-method="singleKey">singleKey</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.ChainingTrustEngineTest" class="method navigator-link" hash-for-method="two">two</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="twoCert">twoCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" class="method navigator-link" hash-for-method="values">values</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.BasicResourceParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509FilesystemParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                      <span>
+                        <img src="passed.png" width="3%"/>
+                        <a href="#" panel-name="suite-Default_suite" title="org.opensaml.spring.credential.X509InlineParserTest" class="method navigator-link" hash-for-method="wrongCert">wrongCert</a> <!-- method navigator-link -->
+                      </span>
+                      <br/>
+                    </div> <!-- method-list-content passed suite-Default_suite -->
+                  </li>
+                </ul>
+              </div> <!-- suite-section-content -->
+            </div> <!-- result-section -->
+          </div> <!-- navigator-suite-content -->
+        </div> <!-- rounded-window -->
+      </div> <!-- suite -->
+    </div> <!-- navigator-root -->
+    <div class="wrapper">
+      <div class="main-panel-root">
+        <div panel-name="suite-Default_suite" class="panel Default_suite">
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="customPropertiesFailsValidation">
+                  </a> <!-- customPropertiesFailsValidation -->
+                  <span class="method-name">customPropertiesFailsValidation</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="customPropertiesSuccess">
+                  </a> <!-- customPropertiesSuccess -->
+                  <span class="method-name">customPropertiesSuccess</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="defaults">
+                  </a> <!-- defaults -->
+                  <span class="method-name">defaults</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="one">
+                  </a> <!-- one -->
+                  <span class="method-name">one</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="two">
+                  </a> <!-- two -->
+                  <span class="method-name">two</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="complex">
+                  </a> <!-- complex -->
+                  <span class="method-name">complex</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="certPath">
+                  </a> <!-- certPath -->
+                  <span class="method-name">certPath</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="nameCheckDisabled">
+                  </a> <!-- nameCheckDisabled -->
+                  <span class="method-name">nameCheckDisabled</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.credential.BasicResourceParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="publicOnly">
+                  </a> <!-- publicOnly -->
+                  <span class="method-name">publicOnly</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="publicPrivate">
+                  </a> <!-- publicPrivate -->
+                  <span class="method-name">publicPrivate</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="secretBase64">
+                  </a> <!-- secretBase64 -->
+                  <span class="method-name">secretBase64</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="secretBinary">
+                  </a> <!-- secretBinary -->
+                  <span class="method-name">secretBinary</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="secretHex">
+                  </a> <!-- secretHex -->
+                  <span class="method-name">secretHex</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="wrongCert">
+                  </a> <!-- wrongCert -->
+                  <span class="method-name">wrongCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.credential.X509InlineParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="certKeyCrl">
+                  </a> <!-- certKeyCrl -->
+                  <span class="method-name">certKeyCrl</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="certOnly">
+                  </a> <!-- certOnly -->
+                  <span class="method-name">certOnly</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="wrongCert">
+                  </a> <!-- wrongCert -->
+                  <span class="method-name">wrongCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="mixed">
+                  </a> <!-- mixed -->
+                  <span class="method-name">mixed</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="multipleCert">
+                  </a> <!-- multipleCert -->
+                  <span class="method-name">multipleCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="singleCert">
+                  </a> <!-- singleCert -->
+                  <span class="method-name">singleCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="singleKey">
+                  </a> <!-- singleKey -->
+                  <span class="method-name">singleKey</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.PKIXInlineParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="complex">
+                  </a> <!-- complex -->
+                  <span class="method-name">complex</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="complex">
+                  </a> <!-- complex -->
+                  <span class="method-name">complex</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.credential.BasicInlineParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="publicOnly">
+                  </a> <!-- publicOnly -->
+                  <span class="method-name">publicOnly</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="publicPrivate">
+                  </a> <!-- publicPrivate -->
+                  <span class="method-name">publicPrivate</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="secretBase64">
+                  </a> <!-- secretBase64 -->
+                  <span class="method-name">secretBase64</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="secretHex">
+                  </a> <!-- secretHex -->
+                  <span class="method-name">secretHex</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.SignatureChainingParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="bean">
+                  </a> <!-- bean -->
+                  <span class="method-name">bean</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="certPath">
+                  </a> <!-- certPath -->
+                  <span class="method-name">certPath</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="nameCheckDisabled">
+                  </a> <!-- nameCheckDisabled -->
+                  <span class="method-name">nameCheckDisabled</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="simple">
+                  </a> <!-- simple -->
+                  <span class="method-name">simple</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="values">
+                  </a> <!-- values -->
+                  <span class="method-name">values</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+          <div class="suite-Default_suite-class-passed">
+            <div class="main-panel-header rounded-window-top">
+              <img src="passed.png"/>
+              <span class="class-name">org.opensaml.spring.credential.X509FilesystemParserTest</span>
+            </div> <!-- main-panel-header rounded-window-top -->
+            <div class="main-panel-content rounded-window-bottom">
+              <div class="method">
+                <div class="method-content">
+                  <a name="certElementsKeyNames">
+                  </a> <!-- certElementsKeyNames -->
+                  <span class="method-name">certElementsKeyNames</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="certKeyCrl">
+                  </a> <!-- certKeyCrl -->
+                  <span class="method-name">certKeyCrl</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="certOnly">
+                  </a> <!-- certOnly -->
+                  <span class="method-name">certOnly</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="twoCert">
+                  </a> <!-- twoCert -->
+                  <span class="method-name">twoCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+              <div class="method">
+                <div class="method-content">
+                  <a name="wrongCert">
+                  </a> <!-- wrongCert -->
+                  <span class="method-name">wrongCert</span>
+                </div> <!-- method-content -->
+              </div> <!-- method -->
+            </div> <!-- main-panel-content rounded-window-bottom -->
+          </div> <!-- suite-Default_suite-class-passed -->
+        </div> <!-- panel Default_suite -->
+        <div panel-name="test-xml-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">/private/var/folders/5f/xsd8c2ld42l1xrzgghx8hf5r0000gn/T/testng-eclipse--2005517064/testng-customsuite.xml</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <pre>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Default suite" guice-stage="DEVELOPMENT">
+  <test thread-count="5" name="Default test" verbose="2">
+    <classes>
+      <class name="org.opensaml.spring.credential.BasicResourceParserTest"/>
+      <class name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest"/>
+      <class name="org.opensaml.spring.trust.StaticExplicitKeyParserTest"/>
+      <class name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest"/>
+      <class name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest"/>
+      <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest"/>
+      <class name="org.opensaml.spring.trust.MockTrustEngine"/>
+      <class name="org.opensaml.spring.credential.X509FilesystemParserTest"/>
+      <class name="org.opensaml.spring.credential.X509InlineParserTest"/>
+      <class name="org.opensaml.spring.trust.ChainingTrustEngineTest"/>
+      <class name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest"/>
+      <class name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest"/>
+      <class name="org.opensaml.spring.trust.SignatureChainingParserTest"/>
+      <class name="org.opensaml.spring.credential.BasicInlineParserTest"/>
+      <class name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest"/>
+      <class name="org.opensaml.spring.trust.PKIXInlineParserTest"/>
+      <class name="org.opensaml.spring.AbstractSecurityParserTest"/>
+      <class name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest"/>
+    </classes>
+  </test> <!-- Default test -->
+</suite> <!-- Default suite -->
+            </pre>
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="testlist-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Tests for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <ul>
+              <li>
+                <span class="test-name">Default test (18 classes)</span>
+              </li>
+            </ul>
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="group-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Groups for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="times-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Times for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="times-div">
+              <script type="text/javascript">
+suiteTableInitFunctions.push('tableData_Default_suite');
+function tableData_Default_suite() {
+var data = new google.visualization.DataTable();
+data.addColumn('number', 'Number');
+data.addColumn('string', 'Method');
+data.addColumn('string', 'Class');
+data.addColumn('number', 'Time (ms)');
+data.addRows(43);
+data.setCell(0, 0, 0)
+data.setCell(0, 1, 'publicOnly')
+data.setCell(0, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(0, 3, 639);
+data.setCell(1, 0, 1)
+data.setCell(1, 1, 'mixed')
+data.setCell(1, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(1, 3, 124);
+data.setCell(2, 0, 2)
+data.setCell(2, 1, 'publicPrivate')
+data.setCell(2, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(2, 3, 113);
+data.setCell(3, 0, 3)
+data.setCell(3, 1, 'bean')
+data.setCell(3, 2, 'org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest')
+data.setCell(3, 3, 73);
+data.setCell(4, 0, 4)
+data.setCell(4, 1, 'wrongCert')
+data.setCell(4, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(4, 3, 68);
+data.setCell(5, 0, 5)
+data.setCell(5, 1, 'certPath')
+data.setCell(5, 2, 'org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest')
+data.setCell(5, 3, 67);
+data.setCell(6, 0, 6)
+data.setCell(6, 1, 'wrongCert')
+data.setCell(6, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(6, 3, 66);
+data.setCell(7, 0, 7)
+data.setCell(7, 1, 'simple')
+data.setCell(7, 2, 'org.opensaml.spring.trust.StaticExplicitKeyParserTest')
+data.setCell(7, 3, 65);
+data.setCell(8, 0, 8)
+data.setCell(8, 1, 'twoCert')
+data.setCell(8, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(8, 3, 63);
+data.setCell(9, 0, 9)
+data.setCell(9, 1, 'singleCert')
+data.setCell(9, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(9, 3, 62);
+data.setCell(10, 0, 10)
+data.setCell(10, 1, 'one')
+data.setCell(10, 2, 'org.opensaml.spring.trust.ChainingTrustEngineTest')
+data.setCell(10, 3, 59);
+data.setCell(11, 0, 11)
+data.setCell(11, 1, 'secretBinary')
+data.setCell(11, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(11, 3, 57);
+data.setCell(12, 0, 12)
+data.setCell(12, 1, 'singleKey')
+data.setCell(12, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(12, 3, 55);
+data.setCell(13, 0, 13)
+data.setCell(13, 1, 'customPropertiesFailsValidation')
+data.setCell(13, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(13, 3, 51);
+data.setCell(14, 0, 14)
+data.setCell(14, 1, 'multipleCert')
+data.setCell(14, 2, 'org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest')
+data.setCell(14, 3, 51);
+data.setCell(15, 0, 15)
+data.setCell(15, 1, 'certKeyCrl')
+data.setCell(15, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(15, 3, 49);
+data.setCell(16, 0, 16)
+data.setCell(16, 1, 'complex')
+data.setCell(16, 2, 'org.opensaml.spring.trust.PKIXFilesystemParserTest')
+data.setCell(16, 3, 48);
+data.setCell(17, 0, 17)
+data.setCell(17, 1, 'secretBase64')
+data.setCell(17, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(17, 3, 48);
+data.setCell(18, 0, 18)
+data.setCell(18, 1, 'certKeyCrl')
+data.setCell(18, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(18, 3, 45);
+data.setCell(19, 0, 19)
+data.setCell(19, 1, 'values')
+data.setCell(19, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(19, 3, 44);
+data.setCell(20, 0, 20)
+data.setCell(20, 1, 'simple')
+data.setCell(20, 2, 'org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest')
+data.setCell(20, 3, 44);
+data.setCell(21, 0, 21)
+data.setCell(21, 1, 'two')
+data.setCell(21, 2, 'org.opensaml.spring.trust.ChainingTrustEngineTest')
+data.setCell(21, 3, 38);
+data.setCell(22, 0, 22)
+data.setCell(22, 1, 'nameCheckDisabled')
+data.setCell(22, 2, 'org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest')
+data.setCell(22, 3, 36);
+data.setCell(23, 0, 23)
+data.setCell(23, 1, 'simple')
+data.setCell(23, 2, 'org.opensaml.spring.trust.SignatureChainingParserTest')
+data.setCell(23, 3, 36);
+data.setCell(24, 0, 24)
+data.setCell(24, 1, 'publicPrivate')
+data.setCell(24, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(24, 3, 35);
+data.setCell(25, 0, 25)
+data.setCell(25, 1, 'wrongCert')
+data.setCell(25, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(25, 3, 31);
+data.setCell(26, 0, 26)
+data.setCell(26, 1, 'complex')
+data.setCell(26, 2, 'org.opensaml.spring.trust.PKIXValidationOptionsParserTest')
+data.setCell(26, 3, 29);
+data.setCell(27, 0, 27)
+data.setCell(27, 1, 'secretHex')
+data.setCell(27, 2, 'org.opensaml.spring.credential.BasicResourceParserTest')
+data.setCell(27, 3, 28);
+data.setCell(28, 0, 28)
+data.setCell(28, 1, 'certElementsKeyNames')
+data.setCell(28, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(28, 3, 28);
+data.setCell(29, 0, 29)
+data.setCell(29, 1, 'certOnly')
+data.setCell(29, 2, 'org.opensaml.spring.credential.X509InlineParserTest')
+data.setCell(29, 3, 27);
+data.setCell(30, 0, 30)
+data.setCell(30, 1, 'customPropertiesSuccess')
+data.setCell(30, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(30, 3, 25);
+data.setCell(31, 0, 31)
+data.setCell(31, 1, 'nameCheckDisabled')
+data.setCell(31, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(31, 3, 22);
+data.setCell(32, 0, 32)
+data.setCell(32, 1, 'simple')
+data.setCell(32, 2, 'org.opensaml.spring.trust.PKIXFilesystemParserTest')
+data.setCell(32, 3, 22);
+data.setCell(33, 0, 33)
+data.setCell(33, 1, 'complex')
+data.setCell(33, 2, 'org.opensaml.spring.trust.PKIXInlineParserTest')
+data.setCell(33, 3, 21);
+data.setCell(34, 0, 34)
+data.setCell(34, 1, 'simple')
+data.setCell(34, 2, 'org.opensaml.spring.trust.PKIXInlineParserTest')
+data.setCell(34, 3, 21);
+data.setCell(35, 0, 35)
+data.setCell(35, 1, 'publicOnly')
+data.setCell(35, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(35, 3, 21);
+data.setCell(36, 0, 36)
+data.setCell(36, 1, 'simple')
+data.setCell(36, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(36, 3, 20);
+data.setCell(37, 0, 37)
+data.setCell(37, 1, 'certPath')
+data.setCell(37, 2, 'org.opensaml.spring.trust.StaticPKIXSignatureParserTest')
+data.setCell(37, 3, 20);
+data.setCell(38, 0, 38)
+data.setCell(38, 1, 'simple')
+data.setCell(38, 2, 'org.opensaml.spring.trust.PKIXValidationOptionsParserTest')
+data.setCell(38, 3, 19);
+data.setCell(39, 0, 39)
+data.setCell(39, 1, 'secretBase64')
+data.setCell(39, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(39, 3, 17);
+data.setCell(40, 0, 40)
+data.setCell(40, 1, 'secretHex')
+data.setCell(40, 2, 'org.opensaml.spring.credential.BasicInlineParserTest')
+data.setCell(40, 3, 15);
+data.setCell(41, 0, 41)
+data.setCell(41, 1, 'defaults')
+data.setCell(41, 2, 'org.opensaml.spring.trust.StaticPKIXFactoryBeanTest')
+data.setCell(41, 3, 15);
+data.setCell(42, 0, 42)
+data.setCell(42, 1, 'certOnly')
+data.setCell(42, 2, 'org.opensaml.spring.credential.X509FilesystemParserTest')
+data.setCell(42, 3, 13);
+window.suiteTableData['Default_suite']= { tableData: data, tableDiv: 'times-div-Default_suite'}
+return data;
+}
+              </script>
+              <span class="suite-total-time">Total running time: 2 seconds</span>
+              <div id="times-div-Default_suite">
+              </div> <!-- times-div-Default_suite -->
+            </div> <!-- times-div -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="reporter-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Reporter output for Default suite</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="ignored-methods-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">14 ignored methods</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.credential.X509InlineParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.PKIXInlineParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.credential.BasicInlineParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.trust.SignatureChainingParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.AbstractSecurityParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+            <div class="ignored-class-div">
+              <span class="ignored-class-name">org.opensaml.spring.credential.X509FilesystemParserTest</span>
+              <div class="ignored-methods-div">
+                <span class="ignored-method-name">setupDirs</span>
+                <br/>
+              </div> <!-- ignored-methods-div -->
+            </div> <!-- ignored-class-div -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+        <div panel-name="chronological-Default_suite" class="panel">
+          <div class="main-panel-header rounded-window-top">
+            <span class="header-content">Methods in chronological order</span>
+          </div> <!-- main-panel-header rounded-window-top -->
+          <div class="main-panel-content rounded-window-bottom">
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.credential.BasicResourceParserTest</div> <!-- chronological-class-name -->
+              <div class="configuration-suite before">
+                <span class="method-name">setupDirs</span>
+                <span class="method-start">0 ms</span>
+              </div> <!-- configuration-suite before -->
+              <div class="test-method">
+                <span class="method-name">publicOnly</span>
+                <span class="method-start">63 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">707 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">publicPrivate</span>
+                <span class="method-start">717 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">833 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">secretBase64</span>
+                <span class="method-start">835 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">885 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">secretBinary</span>
+                <span class="method-start">887 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">946 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">secretHex</span>
+                <span class="method-start">947 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">977 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">wrongCert</span>
+                <span class="method-start">979 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1053 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">mixed</span>
+                <span class="method-start">1059 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1186 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">multipleCert</span>
+                <span class="method-start">1189 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1243 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">singleCert</span>
+                <span class="method-start">1244 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">singleKey</span>
+                <span class="method-start">1309 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1309 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1365 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeyParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">1366 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1434 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">1438 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1483 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.PKIXValidationOptionsParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">complex</span>
+                <span class="method-start">1484 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1514 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">1515 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1537 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.PKIXFilesystemParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">complex</span>
+                <span class="method-start">1537 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1586 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">1587 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1611 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.credential.X509FilesystemParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">certElementsKeyNames</span>
+                <span class="method-start">1612 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1641 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">certKeyCrl</span>
+                <span class="method-start">1642 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">certOnly</span>
+                <span class="method-start">1690 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1690 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1703 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">twoCert</span>
+                <span class="method-start">1704 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1771 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">wrongCert</span>
+                <span class="method-start">1775 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1845 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.credential.X509InlineParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">certKeyCrl</span>
+                <span class="method-start">1847 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1897 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">certOnly</span>
+                <span class="method-start">1898 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1928 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">wrongCert</span>
+                <span class="method-start">1931 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">1965 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.ChainingTrustEngineTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">one</span>
+                <span class="method-start">1966 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2026 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">two</span>
+                <span class="method-start">2030 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2070 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">certPath</span>
+                <span class="method-start">2077 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2146 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">nameCheckDisabled</span>
+                <span class="method-start">2147 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2183 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">customPropertiesFailsValidation</span>
+                <span class="method-start">2184 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">customPropertiesSuccess</span>
+                <span class="method-start">2237 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">defaults</span>
+                <span class="method-start">2263 ms</span>
+              </div> <!-- test-method -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.SignatureChainingParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">2280 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2317 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.credential.BasicInlineParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">publicOnly</span>
+                <span class="method-start">2318 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2340 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">publicPrivate</span>
+                <span class="method-start">2341 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">secretBase64</span>
+                <span class="method-start">2378 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2378 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2396 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">secretHex</span>
+                <span class="method-start">2399 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2415 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">bean</span>
+                <span class="method-start">2416 ms</span>
+              </div> <!-- test-method -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.PKIXInlineParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">complex</span>
+                <span class="method-start">2494 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2516 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">2518 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2540 ms</span>
+              </div> <!-- configuration-method after -->
+            </div> <!-- chronological-class -->
+            <div class="chronological-class">
+              <div class="chronological-class-name">org.opensaml.spring.trust.StaticPKIXSignatureParserTest</div> <!-- chronological-class-name -->
+              <div class="test-method">
+                <span class="method-name">certPath</span>
+                <span class="method-start">2541 ms</span>
+              </div> <!-- test-method -->
+              <div class="test-method">
+                <span class="method-name">nameCheckDisabled</span>
+                <span class="method-start">2562 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2562 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2585 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">simple</span>
+                <span class="method-start">2586 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2607 ms</span>
+              </div> <!-- configuration-method after -->
+              <div class="test-method">
+                <span class="method-name">values</span>
+                <span class="method-start">2608 ms</span>
+              </div> <!-- test-method -->
+              <div class="configuration-method after">
+                <span class="method-name">tearDownTestContext</span>
+                <span class="method-start">2654 ms</span>
+              </div> <!-- configuration-method after -->
+          </div> <!-- main-panel-content rounded-window-bottom -->
+        </div> <!-- panel -->
+      </div> <!-- main-panel-root -->
+    </div> <!-- wrapper -->
+  </body>
+<script type="text/javascript" src="testng-reports2.js"></script>
+</html>
diff --git a/opensaml-spring/test-output/jquery.min.js b/opensaml-spring/test-output/jquery.min.js
new file mode 100644
index 000000000..b0614034a
--- /dev/null
+++ b/opensaml-spring/test-output/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l= [...]
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml
new file mode 100644
index 000000000..29feccab1
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicInlineParserTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.credential.BasicInlineParserTest" time="0.092" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicPrivate" time="0.037"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="publicOnly" time="0.022"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretBase64" time="0.018"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicInlineParserTest" name="secretHex" time="0.015"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicInlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml
new file mode 100644
index 000000000..2c015bbaf
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicResourceParserTest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="6" name="org.opensaml.spring.credential.BasicResourceParserTest" time="0.969" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicOnly" time="0.641"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretHex" time="0.030"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBase64" time="0.050"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="publicPrivate" time="0.114"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="secretBinary" time="0.058"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.BasicResourceParserTest" name="wrongCert" time="0.076"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicResourceParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml
new file mode 100644
index 000000000..c6aef4d0a
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" time="0.073" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest" name="bean" time="0.073"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml
new file mode 100644
index 000000000..e1379df2f
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509FilesystemParserTest.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="5" name="org.opensaml.spring.credential.X509FilesystemParserTest" time="0.220" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="twoCert" time="0.066"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="wrongCert" time="0.067"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certKeyCrl" time="0.045"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certElementsKeyNames" time="0.029"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509FilesystemParserTest" name="certOnly" time="0.013"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.X509FilesystemParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml
new file mode 100644
index 000000000..616d227aa
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.credential.X509InlineParserTest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="3" name="org.opensaml.spring.credential.X509InlineParserTest" time="0.109" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certOnly" time="0.028"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="wrongCert" time="0.032"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.credential.X509InlineParserTest" name="certKeyCrl" time="0.049"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.credential.X509InlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml
new file mode 100644
index 000000000..8400bf92d
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.ChainingTrustEngineTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.ChainingTrustEngineTest" time="0.106" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="two" time="0.044"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.ChainingTrustEngineTest" name="one" time="0.062"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.ChainingTrustEngineTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml
new file mode 100644
index 000000000..4338a7083
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXFilesystemParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXFilesystemParserTest" time="0.072" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="complex" time="0.049"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.PKIXFilesystemParserTest" name="simple" time="0.023"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml
new file mode 100644
index 000000000..8496b2dd8
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXInlineParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXInlineParserTest" time="0.044" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="complex" time="0.021"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.PKIXInlineParserTest" name="simple" time="0.023"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXInlineParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml
new file mode 100644
index 000000000..60017c08b
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.PKIXValidationOptionsParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" time="0.049" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="complex" time="0.029"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.PKIXValidationOptionsParserTest" name="simple" time="0.020"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.PKIXValidationOptionsParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml
new file mode 100644
index 000000000..cbdb373dd
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.SignatureChainingParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.SignatureChainingParserTest" time="0.037" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.SignatureChainingParserTest" name="simple" time="0.037"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.SignatureChainingParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml
new file mode 100644
index 000000000..12ea0d553
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" time="0.296" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="mixed" time="0.127"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleCert" time="0.062"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="singleKey" time="0.055"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest" name="multipleCert" time="0.052"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml
new file mode 100644
index 000000000..353cf1532
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeyParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.StaticExplicitKeyParserTest" time="0.066" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeyParserTest" name="simple" time="0.066"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeyParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml
new file mode 100644
index 000000000..56fecbf30
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="1" name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" time="0.045" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest" name="simple" time="0.045"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml
new file mode 100644
index 000000000..e6284e842
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="3" name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" time="0.091" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesFailsValidation" time="0.051"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="customPropertiesSuccess" time="0.025"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest" name="defaults" time="0.015"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXFactoryBeanTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml
new file mode 100644
index 000000000..4d15490b3
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXSignatureParserTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="4" name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" time="0.108" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="simple" time="0.020"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="values" time="0.044"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="certPath" time="0.021"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXSignatureParserTest" name="nameCheckDisabled" time="0.023"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXSignatureParserTest -->
diff --git a/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml
new file mode 100644
index 000000000..eae852b75
--- /dev/null
+++ b/opensaml-spring/test-output/junitreports/TEST-org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by org.testng.reporters.JUnitReportReporter -->
+<testsuite hostname="Silver-Machine.local" failures="0" tests="2" name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" time="0.105" errors="0" timestamp="2022-06-08T10:36:17 EDT" skipped="0">
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="certPath" time="0.068"/>
+  <system-out/>
+  <testcase classname="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest" name="nameCheckDisabled" time="0.037"/>
+  <system-out/>
+</testsuite> <!-- org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest -->
diff --git a/opensaml-spring/test-output/navigator-bullet.png b/opensaml-spring/test-output/navigator-bullet.png
new file mode 100644
index 000000000..36d90d395
Binary files /dev/null and b/opensaml-spring/test-output/navigator-bullet.png differ
diff --git a/opensaml-spring/test-output/old/Default suite/Default test.properties b/opensaml-spring/test-output/old/Default suite/Default test.properties
new file mode 100644
index 000000000..37da032f9
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/Default test.properties	
@@ -0,0 +1 @@
+[SuiteResult context=Default test]
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/classes.html b/opensaml-spring/test-output/old/Default suite/classes.html
new file mode 100644
index 000000000..5bc32a8d7
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/classes.html	
@@ -0,0 +1,522 @@
+<table border='1'>
+<tr>
+<th>Class name</th>
+<th>Method name</th>
+<th>Groups</th>
+</tr><tr>
+<td>org.opensaml.spring.credential.BasicResourceParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>secretHex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBase64</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicPrivate</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicOnly</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBinary</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>singleCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>multipleCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>mixed</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>singleKey</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeyParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXValidationOptionsParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXFilesystemParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.X509FilesystemParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certKeyCrl</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certOnly</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certElementsKeyNames</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>twoCert</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.X509InlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certKeyCrl</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>wrongCert</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>certOnly</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.ChainingTrustEngineTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>one</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>two</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certPath</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>nameCheckDisabled</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>customPropertiesSuccess</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>defaults</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>customPropertiesFailsValidation</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.SignatureChainingParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.BasicInlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>secretHex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>secretBase64</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicPrivate</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>publicOnly</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>bean</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.PKIXInlineParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>complex</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+<tr>
+<td>org.opensaml.spring.trust.StaticPKIXSignatureParserTest</td>
+<td> </td><td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@Test</td>
+</tr>
+<tr>
+<td> </td>
+<td>certPath</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>values</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>nameCheckDisabled</td>
+<td> </td></tr>
+<tr>
+<td> </td>
+<td>simple</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@BeforeClass</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@BeforeMethod</td>
+</tr>
+<tr>
+<td align='center' colspan='3'>@AfterMethod</td>
+</tr>
+<tr>
+<td> </td>
+<td>tearDownTestContext</td>
+<td> </td></tr>
+<tr>
+<td align='center' colspan='3'>@AfterClass</td>
+</tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/groups.html b/opensaml-spring/test-output/old/Default suite/groups.html
new file mode 100644
index 000000000..199cb3f11
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/groups.html	
@@ -0,0 +1 @@
+<h2>Groups used for this test run</h2>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/index.html b/opensaml-spring/test-output/old/Default suite/index.html
new file mode 100644
index 000000000..8ed202c3b
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/index.html	
@@ -0,0 +1,6 @@
+<html><head><title>Results for Default suite</title></head>
+<frameset cols="26%,74%">
+<frame src="toc.html" name="navFrame">
+<frame src="main.html" name="mainFrame">
+</frameset>
+</html>
diff --git a/opensaml-spring/test-output/old/Default suite/main.html b/opensaml-spring/test-output/old/Default suite/main.html
new file mode 100644
index 000000000..5888ae074
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/main.html	
@@ -0,0 +1,2 @@
+<html><head><title>Results for Default suite</title></head>
+<body>Select a result on the left-hand pane.</body></html>
diff --git a/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html b/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html
new file mode 100644
index 000000000..d554b9445
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods-alphabetical.html	
@@ -0,0 +1,170 @@
+<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table border="1">
+<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
+<tr bgcolor="6aecbc">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicX509CredentialFactoryBeanTest.bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]">bean</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-804</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certElementsKeyNames</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-569</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certKeyCrl</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-774</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certKeyCrl</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-726</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-518</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="707274">  <td>22/06/08 10:36:16</td>   <td>-339</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">certPath</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>125</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">certPath</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d296da">  <td>22/06/08 10:36:16</td>   <td>78</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71beb3">  <td>22/06/08 10:36:15</td>   <td>-932</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="999590">  <td>22/06/08 10:36:15</td>   <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesFailsValidation</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-179</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesSuccess</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-153</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">defaults</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1357</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">mixed</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1227</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">multipleCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>146</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">nameCheckDisabled</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="707274">  <td>22/06/08 10:36:16</td>   <td>-269</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">nameCheckDisabled</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="fc69bd">  <td>22/06/08 10:36:16</td>   <td>-450</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">one</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:14</td>   <td>-2353</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-98</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1699</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicPrivate</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-75</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicPrivate</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1581</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBase64</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-38</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretBase64</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1529</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBinary</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-17</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretHex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1469</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretHex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:14</td>   <td>-2410</td> <td title=">>AbstractSecurityParserTest.setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">>>setupDirs</td> 
+<td> </td><td> </td><td> </td><td> </td><td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>170</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c1bd8b">  <td>22/06/08 10:36:15</td>   <td>-1050</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71beb3">  <td>22/06/08 10:36:15</td>   <td>-901</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d296da">  <td>22/06/08 10:36:16</td>   <td>102</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="6e82ae">  <td>22/06/08 10:36:15</td>   <td>-978</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeySignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="bf6da9">  <td>22/06/08 10:36:16</td>   <td>-136</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="SignatureChainingParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="999590">  <td>22/06/08 10:36:16</td>   <td>-829</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1172</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1107</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleKey</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-345</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-805</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-982</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-805</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-933</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-232</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-99</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-879</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-570</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-345</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1051</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1362</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-451</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>238</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="fc69bd">  <td>22/06/08 10:36:16</td>   <td>-386</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">two</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-712</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">twoCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:17</td>   <td>192</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">values</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1437</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-641</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-485</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/methods-not-run.html b/opensaml-spring/test-output/old/Default suite/methods-not-run.html
new file mode 100644
index 000000000..bfa9dc58d
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods-not-run.html	
@@ -0,0 +1,16 @@
+<h2>Methods that were not run</h2><table>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+<tr><td>org.opensaml.spring.AbstractSecurityParserTest.setupDirs</td></tr>
+</table>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/methods.html b/opensaml-spring/test-output/old/Default suite/methods.html
new file mode 100644
index 000000000..b34b2f4e7
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/methods.html	
@@ -0,0 +1,170 @@
+<h2>Methods run, sorted chronologically</h2><h3>>> means before, << means after</h3><p/><br/><em>Default suite</em><p/><small><i>(Hover the method name to see the test class name)</i></small><p/>
+<table border="1">
+<tr><th>Time</th><th>Delta (ms)</th><th>Suite<br>configuration</th><th>Test<br>configuration</th><th>Class<br>configuration</th><th>Groups<br>configuration</th><th>Method<br>configuration</th><th>Test<br>method</th><th>Thread</th><th>Instances</th></tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d296da">  <td>22/06/08 10:36:16</td>   <td>-46</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>46</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1481</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">mixed</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-836</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">twoCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1561</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-469</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1231</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleKey</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-693</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certKeyCrl</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c1bd8b">  <td>22/06/08 10:36:15</td>   <td>-1174</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-929</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesFailsValidation</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:14</td>   <td>-2534</td> <td title=">>AbstractSecurityParserTest.setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">>>setupDirs</td> 
+<td> </td><td> </td><td> </td><td> </td><td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-898</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certKeyCrl</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71beb3">  <td>22/06/08 10:36:15</td>   <td>-1025</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>22</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">nameCheckDisabled</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1351</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">multipleCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-141</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretHex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-850</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d296da">  <td>22/06/08 10:36:16</td>   <td>-22</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXInlineParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1106</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:14</td>   <td>-2477</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1823</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">publicPrivate</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-765</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-609</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">wrongCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7fb3a0">  <td>22/06/08 10:36:16</td>   <td>-928</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509FilesystemParserTest.certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]">certElementsKeyNames</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71e976">  <td>22/06/08 10:36:16</td>   <td>-642</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="X509InlineParserTest.certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]">certOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-929</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="71beb3">  <td>22/06/08 10:36:15</td>   <td>-1056</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXValidationOptionsParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="999590">  <td>22/06/08 10:36:15</td>   <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">complex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-199</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicPrivate</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:17</td>   <td>68</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">values</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="fc69bd">  <td>22/06/08 10:36:16</td>   <td>-574</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">one</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1057</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>0</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1593</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretHex</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-356</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-223</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1653</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBinary</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="707274">  <td>22/06/08 10:36:16</td>   <td>-463</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">certPath</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="707274">  <td>22/06/08 10:36:16</td>   <td>-393</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXX509CredentialParserTest.nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]">nameCheckDisabled</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="d4a5c2">  <td>22/06/08 10:36:16</td>   <td>1</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXSignatureParserTest.certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]">certPath</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="6aecbc">  <td>22/06/08 10:36:16</td>   <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicX509CredentialFactoryBeanTest.bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]">bean</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1003</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="6e82ae">  <td>22/06/08 10:36:15</td>   <td>-1102</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeySignatureParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="fc69bd">  <td>22/06/08 10:36:16</td>   <td>-510</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="ChainingTrustEngineTest.two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]">two</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="83b0a5">  <td>22/06/08 10:36:15</td>   <td>-1705</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicResourceParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]">secretBase64</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-222</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">publicOnly</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-694</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="bf6da9">  <td>22/06/08 10:36:16</td>   <td>-260</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="SignatureChainingParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7abbaa">  <td>22/06/08 10:36:16</td>   <td>-162</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="BasicInlineParserTest.secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]">secretBase64</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-277</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">defaults</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-469</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1175</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-124</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:15</td>   <td>-1486</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="999590">  <td>22/06/08 10:36:16</td>   <td>-953</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="PKIXFilesystemParserTest.simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]">simple</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="9379b4">  <td>22/06/08 10:36:15</td>   <td>-1296</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticExplicitKeyFactoryBeanTest.singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]">singleCert</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="c9d689">  <td>22/06/08 10:36:16</td>   <td>-303</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td title="StaticPKIXFactoryBeanTest.customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]">customPropertiesSuccess</td> 
+  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:16</td>   <td>-575</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+<tr bgcolor="7a66ec">  <td>22/06/08 10:36:17</td>   <td>114</td> <td> </td><td> </td><td> </td><td> </td><td title="<<AbstractSecurityParserTest.tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]"><<tearDownTestContext</td> 
+<td> </td>  <td>main at 1839337592</td>   <td></td> </tr>
+</table>
diff --git a/opensaml-spring/test-output/old/Default suite/reporter-output.html b/opensaml-spring/test-output/old/Default suite/reporter-output.html
new file mode 100644
index 000000000..063bc2e96
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/reporter-output.html	
@@ -0,0 +1 @@
+<h2>Reporter output</h2><table></table>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/testng.xml.html b/opensaml-spring/test-output/old/Default suite/testng.xml.html
new file mode 100644
index 000000000..e294976d6
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/testng.xml.html	
@@ -0,0 +1 @@
+<html><head><title>testng.xml for Default suite</title></head><body><tt><?xml version="1.0" encoding="UTF-8"?><br/><!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"><br/><suite name="Default suite" guice-stage="DEVELOPMENT"><br/>  <test thread-count="5" name="Default test" verbose="2"><br/>    <classes><br/>      <class nam [...]
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/Default suite/toc.html b/opensaml-spring/test-output/old/Default suite/toc.html
new file mode 100644
index 000000000..4e9703aa4
--- /dev/null
+++ b/opensaml-spring/test-output/old/Default suite/toc.html	
@@ -0,0 +1,30 @@
+<html>
+<head>
+<title>Results for Default suite</title>
+<link href="../testng.css" rel="stylesheet" type="text/css" />
+<link href="../my-testng.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<h3><p align="center">Results for<br/><em>Default suite</em></p></h3>
+<table border='1' width='100%'>
+<tr valign='top'>
+<td>1 test</td>
+<td><a target='mainFrame' href='classes.html'>16 classes</a></td>
+<td>43 methods:<br/>
+  <a target='mainFrame' href='methods.html'>chronological</a><br/>
+  <a target='mainFrame' href='methods-alphabetical.html'>alphabetical</a><br/>
+  <a target='mainFrame' href='methods-not-run.html'>not run (14)</a></td>
+</tr>
+<tr>
+<td><a target='mainFrame' href='groups.html'>0 group</a></td>
+<td><a target='mainFrame' href='reporter-output.html'>reporter output</a></td>
+<td><a target='mainFrame' href='testng.xml.html'>testng.xml</a></td>
+</tr></table>
+<table width='100%' class='test-passed'>
+<tr><td>
+<table style='width: 100%'><tr><td valign='top'>Default test (43/0/0)</td><td valign='top' align='right'>
+  <a href='Default test.html' target='mainFrame'>Results</a>
+</td></tr></table>
+</td></tr><p/>
+</table>
+</body></html>
\ No newline at end of file
diff --git a/opensaml-spring/test-output/old/index.html b/opensaml-spring/test-output/old/index.html
new file mode 100644
index 000000000..e33722098
--- /dev/null
+++ b/opensaml-spring/test-output/old/index.html
@@ -0,0 +1,9 @@
+<html>
+<head><title></title><link href="./testng.css" rel="stylesheet" type="text/css" />
+<link href="./my-testng.css" rel="stylesheet" type="text/css" />
+</head><body>
+<h2><p align='center'>Test results</p></h2>
+<table border='1' width='100%' class='main-page'><tr><th>Suite</th><th>Passed</th><th>Failed</th><th>Skipped</th><th>testng.xml</th></tr>
+<tr align='center' class='invocation-passed'><td><em>Total</em></td><td><em>43</em></td><td><em>0</em></td><td><em>0</em></td><td> </td></tr>
+<tr align='center' class='invocation-passed'><td><a href='Default suite/index.html'>Default suite</a></td>
+<td>43</td><td>0</td><td>0</td><td><a href='Default suite/testng.xml.html'>Link</a></td></tr></table></body></html>
diff --git a/opensaml-spring/test-output/passed.png b/opensaml-spring/test-output/passed.png
new file mode 100644
index 000000000..45e85bbfd
Binary files /dev/null and b/opensaml-spring/test-output/passed.png differ
diff --git a/opensaml-spring/test-output/skipped.png b/opensaml-spring/test-output/skipped.png
new file mode 100644
index 000000000..c36a32439
Binary files /dev/null and b/opensaml-spring/test-output/skipped.png differ
diff --git a/opensaml-spring/test-output/testng-failed.xml b/opensaml-spring/test-output/testng-failed.xml
new file mode 100644
index 000000000..071c33d5e
--- /dev/null
+++ b/opensaml-spring/test-output/testng-failed.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
+<suite name="Failed suite [Default suite]" guice-stage="DEVELOPMENT">
+  <test thread-count="5" name="Default test(failed)">
+    <classes>
+      <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+        <methods>
+          <include name="setupDirs"/>
+          <include name="tearDownTestContext"/>
+          <include name="complex"/>
+        </methods>
+      </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+    </classes>
+  </test> <!-- Default test(failed) -->
+</suite> <!-- Failed suite [Default suite] -->
diff --git a/opensaml-spring/test-output/testng-reports.css b/opensaml-spring/test-output/testng-reports.css
new file mode 100644
index 000000000..d7b75c404
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports.css
@@ -0,0 +1,326 @@
+body {
+    margin: 0 0 5px 5px;
+}
+
+ul {
+    margin: 0;
+}
+
+li {
+    list-style-type: none;
+}
+
+a {
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+.navigator-selected {
+    background: #ffa500;
+}
+
+.wrapper {
+    position: absolute;
+    top: 60px;
+    bottom: 0;
+    left: 400px;
+    right: 0;
+    overflow: auto;
+}
+
+.navigator-root {
+    position: absolute;
+    top: 60px;
+    bottom: 0;
+    left: 0;
+    width: 400px;
+    overflow-y: auto;
+}
+
+.suite {
+    margin: 0 10px 10px 0;
+    background-color: #fff8dc;
+}
+
+.suite-name {
+    padding-left: 10px;
+    font-size: 25px;
+    font-family: Times, sans-serif;
+}
+
+.main-panel-header {
+    padding: 5px;
+    background-color: #9FB4D9; /*afeeee*/;
+    font-family: monospace;
+    font-size: 18px;
+}
+
+.main-panel-content {
+    padding: 5px;
+    margin-bottom: 10px;
+    background-color: #DEE8FC; /*d0ffff*/;
+}
+
+.rounded-window {
+    border-radius: 10px;
+    border-style: solid;
+    border-width: 1px;
+}
+
+.rounded-window-top {
+    border-top-right-radius: 10px 10px;
+    border-top-left-radius: 10px 10px;
+    border-style: solid;
+    border-width: 1px;
+    overflow: auto;
+}
+
+.light-rounded-window-top {
+    border-top-right-radius: 10px 10px;
+    border-top-left-radius: 10px 10px;
+}
+
+.rounded-window-bottom {
+    border-style: solid;
+    border-width: 0 1px 1px 1px;
+    border-bottom-right-radius: 10px 10px;
+    border-bottom-left-radius: 10px 10px;
+    overflow: auto;
+}
+
+.method-name {
+    font-size: 12px;
+    font-family: monospace;
+}
+
+.method-content {
+    border-style: solid;
+    border-width: 0 0 1px 0;
+    margin-bottom: 10px;
+    padding-bottom: 5px;
+    width: 80%;
+}
+
+.parameters {
+    font-size: 14px;
+    font-family: monospace;
+}
+
+.stack-trace {
+    white-space: pre;
+    font-family: monospace;
+    font-size: 12px;
+    font-weight: bold;
+    margin-top: 0;
+    margin-left: 20px;
+}
+
+.testng-xml {
+    font-family: monospace;
+}
+
+.method-list-content {
+    margin-left: 10px;
+}
+
+.navigator-suite-content {
+    margin-left: 10px;
+    font: 12px 'Lucida Grande';
+}
+
+.suite-section-title {
+    margin-top: 10px;
+    width: 80%;
+    border-style: solid;
+    border-width: 1px 0 0 0;
+    font-family: Times, sans-serif;
+    font-size: 18px;
+    font-weight: bold;
+}
+
+.suite-section-content {
+    list-style-image: url(bullet_point.png);
+}
+
+.top-banner-root {
+    position: absolute;
+    top: 0;
+    height: 45px;
+    left: 0;
+    right: 0;
+    padding: 5px;
+    margin: 0 0 5px 0;
+    background-color: #0066ff;
+    font-family: Times, sans-serif;
+    color: #fff;
+    text-align: center;
+}
+.button{
+    position: absolute;
+    margin-left:500px;
+    margin-top:8px;
+    background-color: white;
+    color:#0066ff;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight:bold;
+    border-color:#0066ff ;
+    border-radius:25px;
+    cursor: pointer;
+    height:30px;
+    width:150px;
+    outline:none;
+
+}
+
+.top-banner-title-font {
+    font-size: 25px;
+}
+
+.test-name {
+    font-family: 'Lucida Grande', sans-serif;
+    font-size: 16px;
+}
+
+.suite-icon {
+    padding: 5px;
+    float: right;
+    height: 20px;
+}
+
+.test-group {
+    font: 20px 'Lucida Grande';
+    margin: 5px 5px 10px 5px;
+    border-width: 0 0 1px 0;
+    border-style: solid;
+    padding: 5px;
+}
+
+.test-group-name {
+    font-weight: bold;
+}
+
+.method-in-group {
+    font-size: 16px;
+    margin-left: 80px;
+}
+
+table.google-visualization-table-table {
+    width: 100%;
+}
+
+.reporter-method-name {
+    font-size: 14px;
+    font-family: monospace;
+}
+
+.reporter-method-output-div {
+    padding: 5px;
+    margin: 0 0 5px 20px;
+    font-size: 12px;
+    font-family: monospace;
+    border-width: 0 0 0 1px;
+    border-style: solid;
+}
+
+.ignored-class-div {
+    font-size: 14px;
+    font-family: monospace;
+}
+
+.ignored-methods-div {
+    padding: 5px;
+    margin: 0 0 5px 20px;
+    font-size: 12px;
+    font-family: monospace;
+    border-width: 0 0 0 1px;
+    border-style: solid;
+}
+
+.border-failed {
+    border-top-left-radius: 10px 10px;
+    border-bottom-left-radius: 10px 10px;
+    border-style: solid;
+    border-width: 0 0 0 10px;
+    border-color: #f00;
+}
+
+.border-skipped {
+    border-top-left-radius: 10px 10px;
+    border-bottom-left-radius: 10px 10px;
+    border-style: solid;
+    border-width: 0 0 0 10px;
+    border-color: #edc600;
+}
+
+.border-passed {
+    border-top-left-radius: 10px 10px;
+    border-bottom-left-radius: 10px 10px;
+    border-style: solid;
+    border-width: 0 0 0 10px;
+    border-color: #19f52d;
+}
+
+.times-div {
+    text-align: center;
+    padding: 5px;
+}
+
+.suite-total-time {
+    font: 16px 'Lucida Grande';
+}
+
+.configuration-suite {
+    margin-left: 20px;
+}
+
+.configuration-test {
+    margin-left: 40px;
+}
+
+.configuration-class {
+    margin-left: 60px;
+}
+
+.configuration-method {
+    margin-left: 80px;
+}
+
+.test-method {
+    margin-left: 100px;
+}
+
+.chronological-class {
+    background-color: skyblue;
+    border-style: solid;
+    border-width: 0 0 1px 1px;
+}
+
+.method-start {
+    float: right;
+}
+
+.chronological-class-name {
+    padding: 0 0 0 5px;
+    color: #008;
+}
+
+.after, .before, .test-method {
+    font-family: monospace;
+    font-size: 14px;
+}
+
+.navigator-suite-header {
+    font-size: 22px;
+    margin: 0 10px 5px 0;
+    background-color: #deb887;
+    text-align: center;
+}
+
+.collapse-all-icon {
+    padding: 5px;
+    float: right;
+}
+/*retro Theme*/
diff --git a/opensaml-spring/test-output/testng-reports.js b/opensaml-spring/test-output/testng-reports.js
new file mode 100644
index 000000000..c1a84a35d
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports.js
@@ -0,0 +1,122 @@
+$(document).ready(function() {
+    $('a.navigator-link').on("click", function() {
+        // Extract the panel for this link
+        var panel = getPanelName($(this));
+
+        // Mark this link as currently selected
+        $('.navigator-link').parent().removeClass('navigator-selected');
+        $(this).parent().addClass('navigator-selected');
+
+        showPanel(panel);
+    });
+
+    installMethodHandlers('failed');
+    installMethodHandlers('skipped');
+    installMethodHandlers('passed', true); // hide passed methods by default
+
+    $('a.method').on("click", function() {
+        showMethod($(this));
+        return false;
+    });
+
+    // Hide all the panels and display the first one (do this last
+    // to make sure the click() will invoke the listeners)
+    $('.panel').hide();
+    $('.navigator-link').first().trigger("click");
+
+    // Collapse/expand the suites
+    $('a.collapse-all-link').on("click", function() {
+        var contents = $('.navigator-suite-content');
+        if (contents.css('display') == 'none') {
+            contents.show();
+        } else {
+            contents.hide();
+        }
+    });
+});
+
+// The handlers that take care of showing/hiding the methods
+function installMethodHandlers(name, hide) {
+    function getContent(t) {
+    return $('.method-list-content.' + name + "." + t.attr('panel-name'));
+    }
+
+    function getHideLink(t, name) {
+        var s = 'a.hide-methods.' + name + "." + t.attr('panel-name');
+        return $(s);
+    }
+
+    function getShowLink(t, name) {
+        return $('a.show-methods.' + name + "." + t.attr('panel-name'));
+    }
+
+    function getMethodPanelClassSel(element, name) {
+        var panelName = getPanelName(element);
+    var sel = '.' + panelName + "-class-" + name;
+        return $(sel);
+    }
+
+    $('a.hide-methods.' + name).on("click", function() {
+        var w = getContent($(this));
+        w.hide();
+        getHideLink($(this), name).hide();
+        getShowLink($(this), name).show();
+    getMethodPanelClassSel($(this), name).hide();
+    });
+
+    $('a.show-methods.' + name).on("click", function() {
+        var w = getContent($(this));
+        w.show();
+        getHideLink($(this), name).show();
+        getShowLink($(this), name).hide();
+    showPanel(getPanelName($(this)));
+    getMethodPanelClassSel($(this), name).show();
+    });
+
+    if (hide) {
+        $('a.hide-methods.' + name).trigger("click");
+    } else {
+        $('a.show-methods.' + name).trigger("click");
+    }
+}
+
+function getHashForMethod(element) {
+    return element.attr('hash-for-method');
+}
+
+function getPanelName(element) {
+    return element.attr('panel-name');
+}
+
+function showPanel(panelName) {
+    $('.panel').hide();
+    var panel = $('.panel[panel-name="' + panelName + '"]');
+    panel.show();
+}
+
+function showMethod(element) {
+    var hashTag = getHashForMethod(element);
+    var panelName = getPanelName(element);
+    showPanel(panelName);
+    var current = document.location.href;
+    var base = current.substring(0, current.indexOf('#'))
+    document.location.href = base + '#' + hashTag;
+    var newPosition = $(document).scrollTop() - 65;
+    $(document).scrollTop(newPosition);
+}
+
+function drawTable() {
+    for (var i = 0; i < suiteTableInitFunctions.length; i++) {
+        window[suiteTableInitFunctions[i]]();
+    }
+
+    for (var k in window.suiteTableData) {
+        var v = window.suiteTableData[k];
+        var div = v.tableDiv;
+        var data = v.tableData
+        var table = new google.visualization.Table(document.getElementById(div));
+        table.draw(data, {
+            showRowNumber : false
+        });
+    }
+}
diff --git a/opensaml-spring/test-output/testng-reports1.css b/opensaml-spring/test-output/testng-reports1.css
new file mode 100644
index 000000000..570323ffb
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports1.css
@@ -0,0 +1,344 @@
+body {
+    background-color: whitesmoke;
+    margin: 0 0 5px 5px;
+}
+ul {
+     margin-top: 10px;
+     margin-left:-10px;
+}
+ li {
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     padding:5px 5px;
+ }
+ a {
+     text-decoration: none;
+     color: black;
+     font-size: 14px;
+ }
+
+ a:hover {
+    color:black ;
+    text-decoration: underline;
+ }
+
+ .navigator-selected {
+     /* #ffa500; Mouse hover color after click Orange.*/
+     background:#027368
+ }
+
+ .wrapper {
+     position: absolute;
+     top: 60px;
+     bottom: 0;
+     left: 400px;
+     right: 0;
+     margin-right:9px;
+     overflow: auto;/*imortant*/
+ }
+
+ .navigator-root {
+     position: absolute;
+     top: 60px;
+     bottom: 0;
+     left: 0;
+     width: 400px;
+     overflow-y: auto;/*important*/
+ }
+
+ .suite {
+     margin: -5px 10px 10px 5px;
+     background-color: whitesmoke ;/*Colour of the left bside box*/
+ }
+
+ .suite-name {
+     font-size: 24px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;/*All TEST SUITE*/
+     color: white;
+ }
+
+ .main-panel-header {
+     padding: 5px;
+     background-color: #027368; /*afeeee*/;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     color:white;
+     font-size: 18px;
+ }
+
+ .main-panel-content {
+     padding: 5px;
+     margin-bottom: 10px;
+     background-color: #CCD0D1; /*d0ffff*/; /*Belongs to backGround of rightSide boxes*/
+ }
+
+ .rounded-window {
+     border-style: dotted;
+     border-width: 1px;/*Border of left Side box*/
+     background-color: whitesmoke;
+     border-radius: 10px;
+ }
+
+ .rounded-window-top {
+     border-top-right-radius: 10px 10px;
+     border-top-left-radius: 10px 10px;
+     border-style: solid;
+     border-width: 1px;
+     overflow: auto;/*Top of RightSide box*/
+ }
+
+ .light-rounded-window-top {
+     background-color: #027368;
+     padding-left:120px;
+     border-radius: 10px;
+
+ }
+
+ .rounded-window-bottom {
+     border-bottom-right-radius: 10px 10px;
+     border-bottom-left-radius: 10px 10px;
+     overflow: auto;/*Bottom of rightSide box*/
+ }
+
+ .method-name {
+     font-size: 14px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-weight: bold;
+ }
+
+ .method-content {
+     border-style: solid;
+     border-width: 0 0 1px 0;
+     margin-bottom: 10px;
+     padding-bottom: 5px;
+     width: 100%;
+ }
+
+ .parameters {
+     font-size: 14px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .stack-trace {
+     white-space: pre;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-size: 12px;
+     font-weight: bold;
+     margin-top: 0;
+     margin-left: 20px; /*Error Stack Trace Message*/
+ }
+
+ .testng-xml {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .method-list-content {
+     margin-left: 10px;
+ }
+
+ .navigator-suite-content {
+     margin-left: 10px;
+     font: 12px 'Lucida Grande';
+ }
+
+ .suite-section-title {
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-size: 14px;
+     font-weight:bold;
+     background-color: #8C8887;
+     margin-left: -10px;
+     margin-top:10px;
+     padding:6px;
+ }
+
+ .suite-section-content {
+     list-style-image: url(bullet_point.png);
+     background-color: whitesmoke;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     overflow: hidden;
+ }
+
+ .top-banner-root {
+     position: absolute;
+     top: 0;
+     height: 45px;
+     left: 0;
+     right: 0;
+     padding: 5px;
+     margin: 0 0 5px 0;
+     background-color: #027368;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-size: 18px;
+     color: #fff;
+     text-align: center;/*Belongs to the Top of Report*//*Status: - Completed*/
+ }
+
+ .top-banner-title-font {
+     font-size: 25px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     padding: 3px;
+     float: right;
+ }
+
+ .test-name {
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-size: 16px;
+ }
+
+ .suite-icon {
+     padding: 5px;
+     float: right;
+     height: 20px;
+ }
+
+ .test-group {
+     font: 20px 'Lucida Grande';
+     margin: 5px 5px 10px 5px;
+     border-width: 0 0 1px 0;
+     border-style: solid;
+     padding: 5px;
+ }
+
+ .test-group-name {
+     font-weight: bold;
+ }
+
+ .method-in-group {
+     font-size: 16px;
+     margin-left: 80px;
+ }
+
+ table.google-visualization-table-table {
+     width: 100%;
+ }
+
+ .reporter-method-name {
+     font-size: 14px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .reporter-method-output-div {
+     padding: 5px;
+     margin: 0 0 5px 20px;
+     font-size: 12px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     border-width: 0 0 0 1px;
+     border-style: solid;
+ }
+
+ .ignored-class-div {
+     font-size: 14px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .ignored-methods-div {
+     padding: 5px;
+     margin: 0 0 5px 20px;
+     font-size: 12px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     border-width: 0 0 0 1px;
+     border-style: solid;
+ }
+
+ .border-failed {
+    border-radius:2px;
+     border-style: solid;
+     border-width: 0 0 0 10px;
+     border-color: #F20505;
+ }
+
+ .border-skipped {
+     border-radius:2px;
+     border-style: solid;
+     border-width: 0 0 0 10px;
+     border-color: #F2BE22;
+ }
+
+ .border-passed {
+     border-radius:2px;
+     border-style: solid;
+     border-width: 0 0 0 10px;
+     border-color: #038C73;
+ }
+
+ .times-div {
+     text-align: center;
+     padding: 5px;
+ }
+
+ .suite-total-time {
+     font: 16px 'Lucida Grande';
+ }
+
+ .configuration-suite {
+     margin-left: 20px;
+ }
+
+ .configuration-test {
+     margin-left: 40px;
+ }
+
+ .configuration-class {
+     margin-left: 60px;
+ }
+
+ .configuration-method {
+     margin-left: 80px;
+ }
+
+ .test-method {
+     margin-left: 100px;
+ }
+
+ .chronological-class {
+     background-color: #CCD0D1;
+     border-width: 0 0 1px 1px;/*Chronological*/
+ }
+
+ .method-start {
+     float: right;
+ }
+
+ .chronological-class-name {
+     padding: 0 0 0 5px;
+     margin-top:5px;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     color: #008;
+ }
+
+ .after, .before, .test-method {
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     font-size: 14px;
+     margin-top:5px;
+ }
+
+ .navigator-suite-header {
+     font-size: 18px;
+     margin: 0px 10px 10px 5px;
+     padding: 5px;
+     border-radius: 10px;
+     background-color: #027368;
+     color: white;
+     font-weight:bold;
+     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+     text-align: center; /*All Suites on top of left box*//*Status: -Completed*/
+ }
+
+ .collapse-all-icon {
+     padding: 3px;
+     float: right;
+ }
+ .button{
+    position: absolute;
+    margin-left:500px;
+    margin-top:8px;
+    background-color: white;
+    color:#027368;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight:bold;
+    border-color:#027368;
+    border-radius:25px;
+    cursor: pointer;
+    height:30px;
+    width:150px;
+    outline: none;
+}
+/*Author: - Akhil Gullapalli*/
\ No newline at end of file
diff --git a/opensaml-spring/test-output/testng-reports2.js b/opensaml-spring/test-output/testng-reports2.js
new file mode 100644
index 000000000..5342859fa
--- /dev/null
+++ b/opensaml-spring/test-output/testng-reports2.js
@@ -0,0 +1,76 @@
+window.onload = function () {
+  let cookies = document.cookie;
+  let cookieValue = cookies.split('=');
+  if (cookieValue[1] === 'null' || localStorage.getItem('Theme') === 'null') {
+    document.getElementById('retro').setAttribute('disabled', 'false');
+  } else if (cookieValue[1] === 'Switch Ultra Theme' ||
+      localStorage.getItem('Theme') === 'Switch Ultra Theme') {
+    document.getElementById('button').innerText = "Switch Retro Theme";
+    document.getElementById('retro').setAttribute('disabled', 'false');
+
+  } else if (cookieValue[1] === 'Switch Retro Theme' ||
+      localStorage.getItem('Theme') === 'Switch Retro Theme') {
+    if (cookieValue[1] === 'Switch Ultra Theme' ||
+        localStorage.getItem('Theme') === 'Switch Ultra Theme') {
+      document.getElementById('button').innerText = "Switch Retro Theme";
+      document.getElementById('retro').setAttribute('disabled', 'false');
+
+      document.getElementById('button').innerText = "Switch Ultra Theme";
+      document.getElementById('retro').removeAttribute('disabled');
+      document.getElementById('ultra').setAttribute('disabled', 'false');
+      localStorage.setItem('Theme', select);
+
+    } else if (select === 'Switch Ultra Theme') {
+      document.getElementById('button').innerText = "Switch Retro Theme";
+      document.getElementById('ultra').removeAttribute('disabled');
+      document.getElementById('retro').setAttribute('disabled', 'false');
+      localStorage.setItem('Theme', select);
+    }
+  } else if (cookieValue[1] === 'Switch Retro Theme' ||
+      localStorage.getItem('Theme') === 'Switch Retro Theme') {
+    document.getElementById('button').innerText = "Switch Ultra Theme";
+    document.getElementById('ultra').setAttribute('disabled', 'false');
+  }
+}
+document.getElementById('button').onclick = function () {
+  let select = document.getElementById('button').innerText;
+  if (select === 'Switch Retro Theme') {
+    let d = new Date();
+    days = 365;
+    d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
+    document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
+    document.getElementById('button').innerText = "Switch Ultra Theme";
+    document.getElementById('retro').removeAttribute('disabled');
+    document.getElementById('ultra').setAttribute('disabled', 'false');
+    localStorage.setItem('Theme', select);
+
+  } else if (select === 'Switch Ultra Theme') {
+    let d = new Date();
+    days = 365;
+    d.setTime(+d + (days * 86400000)); //24 * 60 * 60 * 1000
+    document.cookie = "Theme =" + select + "; expires=" + d.toGMTString() + ";";
+    document.getElementById('button').innerText = "Switch Retro Theme";
+    document.getElementById('ultra').removeAttribute('disabled');
+    document.getElementById('retro').setAttribute('disabled', 'false');
+    localStorage.setItem('Theme', select);
+  }
+}
+//Function to mouse hovering affect.
+document.getElementById('button').onmouseover = function () {
+  document.getElementById('button').style.borderRadius = "25px";
+  document.getElementById('button').style.width = "180px";
+  document.getElementById('button').style.height = "45px";
+  document.getElementById('button').style.marginTop = "1px";
+
+}
+//Function to mouse out affect
+document.getElementById('button').onmouseout = function () {
+  document.getElementById('button').style.borderRadius = "25px";
+  document.getElementById('button').style.width = "150px";
+  document.getElementById('button').style.height = "30px";
+  document.getElementById('button').style.marginTop = "8px";
+
+}
+
+//This is the file where we handle the switching of the Themes.
+/*Author:- Akhil Gullapalli*/
diff --git a/opensaml-spring/test-output/testng-results.xml b/opensaml-spring/test-output/testng-results.xml
new file mode 100644
index 000000000..fb4b67998
--- /dev/null
+++ b/opensaml-spring/test-output/testng-results.xml
@@ -0,0 +1,703 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testng-results ignored="14" total="57" passed="43" failed="0" skipped="0">
+  <reporter-output>
+  </reporter-output>
+  <suite started-at="2022-06-08T10:36:14 EDT" name="Default suite" finished-at="2022-06-08T10:36:17 EDT" duration-ms="2631">
+    <groups>
+    </groups>
+    <test started-at="2022-06-08T10:36:14 EDT" name="Default test" finished-at="2022-06-08T10:36:17 EDT" duration-ms="2631">
+      <class name="org.opensaml.spring.credential.BasicResourceParserTest">
+        <test-method is-config="true" signature="setupDirs()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:14 EDT" name="setupDirs" finished-at="2022-06-08T10:36:14 EDT" duration-ms="23" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- setupDirs -->
+        <test-method signature="publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:14 EDT" name="publicOnly" finished-at="2022-06-08T10:36:15 EDT" duration-ms="639" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- publicOnly -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="8" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="publicPrivate" finished-at="2022-06-08T10:36:15 EDT" duration-ms="113" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- publicPrivate -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretBase64" finished-at="2022-06-08T10:36:15 EDT" duration-ms="48" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- secretBase64 -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="secretBinary()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretBinary" finished-at="2022-06-08T10:36:15 EDT" duration-ms="57" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- secretBinary -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="secretHex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="28" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- secretHex -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="wrongCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="68" status="PASS">
+          <exception class="org.springframework.beans.factory.BeanCreationException">
+            <message>
+              <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+            </message>
+            <full-stacktrace>
+              <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.BasicResourceParserTest.wrongCert(BasicResourceParserTest.java:46)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:125)
+at org.opensaml.spring.credential.AbstractBasicCredentialFactoryBean.doCreateInstance(AbstractBasicCredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 50 more
+]]>
+            </full-stacktrace>
+          </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- wrongCert -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicResourceParserTest at 3d1cfad4]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="2" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.credential.BasicResourceParserTest -->
+      <class name="org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest">
+        <test-method signature="mixed()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="mixed" finished-at="2022-06-08T10:36:15 EDT" duration-ms="124" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- mixed -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="3" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="multipleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="multipleCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="51" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- multipleCert -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="singleCert()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="singleCert" finished-at="2022-06-08T10:36:15 EDT" duration-ms="62" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- singleCert -->
+        <test-method signature="singleKey()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="singleKey" finished-at="2022-06-08T10:36:15 EDT" duration-ms="55" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- singleKey -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest at 11bd0f3b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.StaticExplicitKeyFactoryBeanTest -->
+      <class name="org.opensaml.spring.trust.StaticExplicitKeyParserTest">
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="65" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeyParserTest at c333c60]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.StaticExplicitKeyParserTest -->
+      <class name="org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest">
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="44" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest at 79da8dc5]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.StaticExplicitKeySignatureParserTest -->
+      <class name="org.opensaml.spring.trust.PKIXValidationOptionsParserTest">
+        <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="complex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="29" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- complex -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="simple" finished-at="2022-06-08T10:36:15 EDT" duration-ms="19" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXValidationOptionsParserTest at 1eb5174b]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:15 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.PKIXValidationOptionsParserTest -->
+      <class name="org.opensaml.spring.trust.PKIXFilesystemParserTest">
+        <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:15 EDT" name="complex" finished-at="2022-06-08T10:36:15 EDT" duration-ms="48" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- complex -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:15 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="22" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXFilesystemParserTest at 67080771]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.PKIXFilesystemParserTest -->
+      <class name="org.opensaml.spring.credential.X509FilesystemParserTest">
+        <test-method signature="certElementsKeyNames()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certElementsKeyNames" finished-at="2022-06-08T10:36:16 EDT" duration-ms="28" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certElementsKeyNames -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certKeyCrl" finished-at="2022-06-08T10:36:16 EDT" duration-ms="45" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certKeyCrl -->
+        <test-method signature="certOnly()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="certOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="13" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certOnly -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="twoCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="twoCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="63" status="PASS">
+          <exception class="org.springframework.beans.factory.BeanCreationException">
+            <message>
+              <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded]]>
+            </message>
+            <full-stacktrace>
+              <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+at org.opensaml.spring.credential.X509FilesystemParserTest.twoCert(X509FilesystemParserTest.java:53)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Configuration element indicated an entityCertificate, but multiple certificates were decoded
+at org.opensaml.spring.credential.BasicX509CredentialFactoryBean.getEntityCertificate(BasicX509CredentialFactoryBean.java:161)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:55)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 44 more
+]]>
+            </full-stacktrace>
+          </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- twoCert -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="3" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="wrongCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="66" status="PASS">
+          <exception class="org.springframework.beans.factory.BeanCreationException">
+            <message>
+              <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+            </message>
+            <full-stacktrace>
+              <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509FilesystemParserTest.lookup(X509FilesystemParserTest.java:39)
+at org.opensaml.spring.credential.X509FilesystemParserTest.wrongCert(X509FilesystemParserTest.java:57)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 44 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 51 more
+]]>
+            </full-stacktrace>
+          </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- wrongCert -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509FilesystemParserTest at 72cde7cc]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.credential.X509FilesystemParserTest -->
+      <class name="org.opensaml.spring.credential.X509InlineParserTest">
+        <test-method signature="certKeyCrl()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="certKeyCrl" finished-at="2022-06-08T10:36:16 EDT" duration-ms="49" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certKeyCrl -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="certOnly()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="certOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="27" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certOnly -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="wrongCert()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="wrongCert" finished-at="2022-06-08T10:36:16 EDT" duration-ms="31" status="PASS">
+          <exception class="org.springframework.beans.factory.BeanCreationException">
+            <message>
+              <![CDATA[Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification]]>
+            </message>
+            <full-stacktrace>
+              <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IdPCredential': Invocation of init method failed; nested exception is org.opensaml.security.SecurityException: Error during signature verification
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:225)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1265)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1226)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:483)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:338)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
+at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:95)
+at org.opensaml.spring.AbstractSecurityParserTest.getBean(AbstractSecurityParserTest.java:68)
+at org.opensaml.spring.credential.X509InlineParserTest.wrongCert(X509InlineParserTest.java:48)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.opensaml.security.SecurityException: Error during signature verification
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:219)
+at org.opensaml.security.crypto.KeySupport.matchKeyPair(KeySupport.java:613)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:68)
+at org.opensaml.spring.credential.AbstractX509CredentialFactoryBean.doCreateInstance(AbstractX509CredentialFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 43 more
+Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128
+at java.base/sun.security.rsa.RSASignature.engineVerify(RSASignature.java:213)
+at java.base/java.security.Signature$Delegate.engineVerify(Signature.java:1435)
+at java.base/java.security.Signature.verify(Signature.java:789)
+at org.opensaml.security.crypto.SigningUtil.verify(SigningUtil.java:216)
+... 50 more
+]]>
+            </full-stacktrace>
+          </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- wrongCert -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.X509InlineParserTest at 5fd4f8f5]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.credential.X509InlineParserTest -->
+      <class name="org.opensaml.spring.trust.ChainingTrustEngineTest">
+        <test-method signature="one()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="one" finished-at="2022-06-08T10:36:16 EDT" duration-ms="59" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- one -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="3" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="two()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="two" finished-at="2022-06-08T10:36:16 EDT" duration-ms="38" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- two -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.ChainingTrustEngineTest at 696da30b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="6" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.ChainingTrustEngineTest -->
+      <class name="org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest">
+        <test-method signature="certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="certPath" finished-at="2022-06-08T10:36:16 EDT" duration-ms="67" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certPath -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="nameCheckDisabled" finished-at="2022-06-08T10:36:16 EDT" duration-ms="36" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- nameCheckDisabled -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest at 4e7912d8]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.StaticPKIXX509CredentialParserTest -->
+      <class name="org.opensaml.spring.trust.StaticPKIXFactoryBeanTest">
+        <test-method signature="customPropertiesFailsValidation()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="customPropertiesFailsValidation" finished-at="2022-06-08T10:36:16 EDT" duration-ms="51" status="PASS">
+          <exception class="org.springframework.beans.factory.BeanCreationException">
+            <message>
+              <![CDATA[Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled]]>
+            </message>
+            <full-stacktrace>
+              <![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StaticPKIXX509CredentialTrustEngine' defined in class path resource [org/opensaml/spring/trust/static-pkix-factory-custom-failsValidation.xml]: Invocation of init method failed; nested exception is org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1755)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:604)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:526)
+at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)
+at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
+at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
+at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
+at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:922)
+at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:926)
+at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:592)
+at org.opensaml.spring.trust.StaticPKIXFactoryBeanTest.customPropertiesFailsValidation(StaticPKIXFactoryBeanTest.java:101)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
+at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+at java.base/java.lang.reflect.Method.invoke(Method.java:568)
+at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
+at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:673)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:220)
+at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
+at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:945)
+at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:193)
+at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
+at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
+at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+at org.testng.TestRunner.privateRun(TestRunner.java:808)
+at org.testng.TestRunner.run(TestRunner.java:603)
+at org.testng.SuiteRunner.runTest(SuiteRunner.java:429)
+at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:423)
+at org.testng.SuiteRunner.privateRun(SuiteRunner.java:383)
+at org.testng.SuiteRunner.run(SuiteRunner.java:326)
+at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
+at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
+at org.testng.TestNG.runSuitesSequentially(TestNG.java:1249)
+at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
+at org.testng.TestNG.runSuites(TestNG.java:1092)
+at org.testng.TestNG.run(TestNG.java:1060)
+at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
+at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
+at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
+Caused by: org.springframework.beans.FatalBeanException: Certificate revocation checking was force enabled, but no static CRLs were supplied and both CRLDP and OCSP processing is disabled
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.validateConfiguration(StaticPKIXFactoryBean.java:271)
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:244)
+at org.opensaml.spring.trust.StaticPKIXFactoryBean.doCreateInstance(StaticPKIXFactoryBean.java:1)
+at net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean.createInstance(AbstractComponentAwareFactoryBean.java:49)
+at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1802)
+at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1751)
+... 38 more
+]]>
+            </full-stacktrace>
+          </exception> <!-- org.springframework.beans.factory.BeanCreationException -->
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- customPropertiesFailsValidation -->
+        <test-method signature="customPropertiesSuccess()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="customPropertiesSuccess" finished-at="2022-06-08T10:36:16 EDT" duration-ms="25" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- customPropertiesSuccess -->
+        <test-method signature="defaults()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXFactoryBeanTest at 53976f5c]" started-at="2022-06-08T10:36:16 EDT" name="defaults" finished-at="2022-06-08T10:36:16 EDT" duration-ms="15" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- defaults -->
+      </class> <!-- org.opensaml.spring.trust.StaticPKIXFactoryBeanTest -->
+      <class name="org.opensaml.spring.trust.SignatureChainingParserTest">
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="36" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.SignatureChainingParserTest at 2bfc268b]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.SignatureChainingParserTest -->
+      <class name="org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest">
+        <test-method signature="bean()[pri:0, instance:org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest at 29e495ff]" started-at="2022-06-08T10:36:16 EDT" name="bean" finished-at="2022-06-08T10:36:16 EDT" duration-ms="73" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- bean -->
+      </class> <!-- org.opensaml.spring.credential.BasicX509CredentialFactoryBeanTest -->
+      <class name="org.opensaml.spring.credential.BasicInlineParserTest">
+        <test-method signature="publicOnly()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="publicOnly" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- publicOnly -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="publicPrivate()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="publicPrivate" finished-at="2022-06-08T10:36:16 EDT" duration-ms="35" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- publicPrivate -->
+        <test-method signature="secretBase64()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="secretBase64" finished-at="2022-06-08T10:36:16 EDT" duration-ms="17" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- secretBase64 -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="2" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="secretHex()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="secretHex" finished-at="2022-06-08T10:36:16 EDT" duration-ms="15" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- secretHex -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.credential.BasicInlineParserTest at 2f8dad04]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.credential.BasicInlineParserTest -->
+      <class name="org.opensaml.spring.trust.PKIXInlineParserTest">
+        <test-method signature="complex()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="complex" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- complex -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="2" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:16 EDT" duration-ms="21" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.PKIXInlineParserTest at 41e1e210]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.PKIXInlineParserTest -->
+      <class name="org.opensaml.spring.trust.StaticPKIXSignatureParserTest">
+        <test-method signature="certPath()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="certPath" finished-at="2022-06-08T10:36:16 EDT" duration-ms="20" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- certPath -->
+        <test-method signature="nameCheckDisabled()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="nameCheckDisabled" finished-at="2022-06-08T10:36:16 EDT" duration-ms="22" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- nameCheckDisabled -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:16 EDT" duration-ms="0" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="simple()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:16 EDT" name="simple" finished-at="2022-06-08T10:36:17 EDT" duration-ms="20" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- simple -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:17 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+        <test-method signature="values()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="values" finished-at="2022-06-08T10:36:17 EDT" duration-ms="44" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- values -->
+        <test-method is-config="true" signature="tearDownTestContext()[pri:0, instance:org.opensaml.spring.trust.StaticPKIXSignatureParserTest at 4944252c]" started-at="2022-06-08T10:36:17 EDT" name="tearDownTestContext" finished-at="2022-06-08T10:36:17 EDT" duration-ms="1" status="PASS">
+          <reporter-output>
+          </reporter-output>
+        </test-method> <!-- tearDownTestContext -->
+      </class> <!-- org.opensaml.spring.trust.StaticPKIXSignatureParserTest -->
+    </test> <!-- Default test -->
+  </suite> <!-- Default suite -->
+</testng-results>
diff --git a/opensaml-spring/test-output/testng.css b/opensaml-spring/test-output/testng.css
new file mode 100644
index 000000000..5124ba863
--- /dev/null
+++ b/opensaml-spring/test-output/testng.css
@@ -0,0 +1,9 @@
+.invocation-failed,  .test-failed  { background-color: #DD0000; }
+.invocation-percent, .test-percent { background-color: #006600; }
+.invocation-passed,  .test-passed  { background-color: #00AA00; }
+.invocation-skipped, .test-skipped { background-color: #CCCC00; }
+
+.main-page {
+  font-size: x-large;
+}
+

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


More information about the commits mailing list