diff --git a/etc/santuario-pmd-ruleset.xml b/etc/santuario-pmd-ruleset.xml
index e2ea275..43553ee 100644
--- a/etc/santuario-pmd-ruleset.xml
+++ b/etc/santuario-pmd-ruleset.xml
@@ -24,103 +24,21 @@
   A PMD ruleset for Apache Santuario
   </description>
 
-  <rule ref="category/java/bestpractices.xml">
-     <exclude name="AbstractClassWithoutAbstractMethod" />
-     <exclude name="AccessorMethodGeneration" />
-     <exclude name="ArrayIsStoredDirectly" />
-     <exclude name="AvoidReassigningParameters" />
+  <rule ref="rulesets/java/basic.xml">
      <exclude name="AvoidUsingHardCodedIP" />
-     <exclude name="ConstantsInInterface" />
-     <exclude name="ForLoopCanBeForeach" />
-     <exclude name="GuardLogStatement" />
-     <exclude name="JUnitAssertionsShouldIncludeMessage"/>
-     <exclude name="JUnitTestContainsTooManyAsserts" />
-     <exclude name="JUnitTestsShouldIncludeAssert" />
-     <exclude name="JUnitUseExpected" />
-     <exclude name="MethodReturnsInternalArray" />
-     <exclude name="MissingOverride" />
-     <exclude name="OneDeclarationPerLine" />
-     <exclude name="PreserveStackTrace" />
-     <exclude name="SwitchStmtsShouldHaveDefault" />
-     <exclude name="SystemPrintln" />
-     <exclude name="UnusedPrivateMethod" />
-     <exclude name="UseAssertSameInsteadOfAssertTrue" />
-     <exclude name="UseVarargs" />
+     <exclude name="SimplifiedTernary" />
   </rule>
+  <rule ref="rulesets/java/unusedcode.xml"/>
+  <rule ref="rulesets/java/imports.xml"/>
+  <rule ref="rulesets/java/braces.xml"/>
+  <rule ref="rulesets/java/empty.xml">
+      <exclude name="EmptyCatchBlock" />
+  </rule>
+  <rule ref="rulesets/java/migrating.xml">
+     <exclude name="JUnit4TestShouldUseAfterAnnotation" /> 
+     <exclude name="JUnit4TestShouldUseTestAnnotation" /> 
+     <exclude name="JUnitUseExpected" /> 
+  </rule>
+  <rule ref="rulesets/java/unnecessary.xml"/>
 
-  <rule ref="category/java/design.xml" >
-     <exclude name="AvoidCatchingGenericException" />
-     <exclude name="AvoidDeeplyNestedIfStmts" />
-     <exclude name="AvoidRethrowingException" />
-     <exclude name="AvoidThrowingNullPointerException" />
-     <exclude name="AvoidThrowingRawExceptionTypes" />
-     <exclude name="CouplingBetweenObjects" />
-     <exclude name="CyclomaticComplexity" />
-     <exclude name="DataClass" />
-     <exclude name="ExceptionAsFlowControl" />
-     <exclude name="ExcessiveClassLength" />
-     <exclude name="ExcessiveImports" />
-     <exclude name="ExcessiveMethodLength" />
-     <exclude name="ExcessivePublicCount" />
-     <exclude name="GodClass" />
-     <exclude name="ImmutableField" />
-     <exclude name="LawOfDemeter" />
-     <exclude name="NcssCount" />
-     <exclude name="NPathComplexity" />
-     <exclude name="SignatureDeclareThrowsException" />
-     <exclude name="SingularField" />
-     <exclude name="SwitchDensity" />
-     <exclude name="TooManyFields" />
-     <exclude name="TooManyMethods" />
-     <exclude name="UseObjectForClearerAPI" />
-     <exclude name="UseUtilityClass" />
-  </rule>
-
-  <rule ref="category/java/errorprone.xml">
-     <exclude name="AssignmentInOperand" />
-     <exclude name="AssignmentToNonFinalStatic" />
-     <exclude name="AvoidCatchingNPE" />
-     <exclude name="AvoidCatchingThrowable" />
-     <exclude name="AvoidDuplicateLiterals" />
-     <exclude name="AvoidFieldNameMatchingMethodName" />
-     <exclude name="AvoidLiteralsInIfCondition" />
-     <exclude name="BeanMembersShouldSerialize" />
-     <exclude name="CompareObjectsWithEquals" />
-     <exclude name="ConstructorCallsOverridableMethod" />
-     <exclude name="DataflowAnomalyAnalysis" />
-     <exclude name="DoNotCallGarbageCollectionExplicitly" />
-     <exclude name="EmptyCatchBlock" />
-     <exclude name="InvalidSlf4jMessageFormat" />
-     <exclude name="JUnitSpelling" />
-     <exclude name="MissingSerialVersionUID" />
-     <exclude name="NullAssignment" />
-     <exclude name="SingletonClassReturningNewInstance" />
-     <exclude name="SingleMethodSingleton" />
-     <exclude name="SuspiciousEqualsMethodName" />
-     <exclude name="UseLocaleWithCaseConversions" />
-     <exclude name="UseProperClassLoader" />
-  </rule>
-
-  <rule ref="category/java/multithreading.xml">
-     <exclude name="AvoidSynchronizedAtMethodLevel" />
-     <exclude name="AvoidUsingVolatile" />
-     <exclude name="DoNotUseThreads" />
-     <exclude name="UseConcurrentHashMap" />
-  </rule>
-
-  <rule ref="category/java/performance.xml">
-     <exclude name="AddEmptyString" />
-     <exclude name="AvoidInstantiatingObjectsInLoops" />
-     <exclude name="AvoidFileStream" />
-     <exclude name="ConsecutiveAppendsShouldReuse" />
-     <exclude name="InefficientEmptyStringCheck" />
-     <exclude name="OptimizableToArrayCall" />
-     <exclude name="RedundantFieldInitializer" />
-     <exclude name="UseStringBufferForStringAppends" />
-  </rule>
-
-  <rule ref="category/java/security.xml" >
-     <exclude name="HardCodedCryptoKey" />
-  </rule>
-      
 </ruleset>
diff --git a/pom.xml b/pom.xml
index 18a5ada..97501c2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
     <artifactId>xmlsec</artifactId>
     <packaging>bundle</packaging>
     <name>Apache XML Security for Java</name>
-    <version>2.2.0-SNAPSHOT</version>
+    <version>2.1.3</version>
     <description>
         Apache XML Security for Java supports XML-Signature Syntax and Processing,
         W3C Recommendation 12 February 2002, and XML Encryption Syntax and
@@ -57,12 +57,12 @@
     </licenses>
     <scm>
         <connection>
-            scm:svn:http://svn.apache.org/repos/asf/santuario/xml-security-java/trunk/
+            scm:svn:http://svn.apache.org/repos/asf/santuario/xml-security-java/tags/xmlsec-2.1.3
         </connection>
         <developerConnection>
-            scm:svn:https://svn.apache.org/repos/asf/santuario/xml-security-java/trunk/
+            scm:svn:https://svn.apache.org/repos/asf/santuario/xml-security-java/tags/xmlsec-2.1.3
         </developerConnection>
-        <url>http://svn.apache.org/repos/asf/santuario/xml-security-java/trunk/</url>
+        <url>http://svn.apache.org/repos/asf/santuario/xml-security-java/tags/xmlsec-2.1.3</url>
     </scm>
     <organization>
         <name>The Apache Software Foundation</name>
@@ -111,7 +111,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-pmd-plugin</artifactId>
-                <version>3.11.0</version>
+                <version>3.7</version>
                 <configuration>
                     <rulesets>
                         <ruleset>${basedir}/etc/santuario-pmd-ruleset.xml</ruleset>
@@ -157,18 +157,23 @@
                 <configuration>
                     <source>${targetJdk}</source>
                     <target>${targetJdk}</target>
-                    <compilerArgs>
-                        <arg>-XDcompilePolicy=simple</arg>
-                        <arg>-Xplugin:ErrorProne</arg>
-                    </compilerArgs>
-                    <annotationProcessorPaths>
-                        <path>
-                            <groupId>com.google.errorprone</groupId>
-                            <artifactId>error_prone_core</artifactId>
-                            <version>2.3.2</version>
-                        </path>
-                    </annotationProcessorPaths>
+                    <compilerId>javac-with-errorprone</compilerId>
+                    <forceJavacCompilerUse>true</forceJavacCompilerUse>
                 </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.codehaus.plexus</groupId>
+                        <artifactId>plexus-compiler-javac-errorprone</artifactId>
+                        <version>2.8</version>
+                    </dependency>
+                    <!-- override plexus-compiler-javac-errorprone's dependency on
+                         Error Prone with the latest version -->
+                    <dependency>
+                        <groupId>com.google.errorprone</groupId>
+                        <artifactId>error_prone_core</artifactId>
+                        <version>2.1.1</version>
+                    </dependency>
+                </dependencies>
             </plugin>
             
             <plugin>
@@ -193,7 +198,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>4.1.0</version>
+                <version>3.2.0</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
@@ -223,10 +228,15 @@
                 </configuration>
             </plugin>
             
+            <!--
+            TODO when maven-jaxb2-plugin supports Java 9 properly then
+            uncomment this and remove the code:
+              src/main/java/org/apache/xml/security/binding/
+              src/main/java/org/apache/xml/security/configuration/
             <plugin>
                 <groupId>org.jvnet.jaxb2.maven2</groupId>
                 <artifactId>maven-jaxb2-plugin</artifactId>
-                <version>0.14.0</version>
+                <version>0.13.2</version>
                 <executions>
                     <execution>
                         <id>bindings</id>
@@ -254,15 +264,14 @@
                                 <bindingInclude>xenc.xjb</bindingInclude>
                                 <bindingInclude>xenc11.xjb</bindingInclude>
                                 <bindingInclude>security-config.xjb</bindingInclude>
-                                <bindingInclude>xop.xjb</bindingInclude>
                             </bindingIncludes>
                             <catalog>${basedir}/src/main/resources/bindings/bindings.cat</catalog>
                             <forceRegenerate>false</forceRegenerate>
                             <episode>true</episode>
                             <specVersion>2.1</specVersion>
                             <extension>true</extension>
-                            <!-- disable schema validation since the validation code
-                            doesn't respect the catalog and will do online lookups :-( -->
+                             disable schema validation since the validation code
+                            doesn't respect the catalog and will do online lookups :-(
                             <strict>false</strict>
                             <args>
                                 <arg>-npa</arg>
@@ -271,6 +280,7 @@
                     </execution>
                 </executions>
             </plugin>
+            -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-release-plugin</artifactId>
@@ -332,19 +342,6 @@
                         <minSeverity>${minSeverity}</minSeverity>
                     </configuration>
                 </plugin>
-                <plugin>
-                    <groupId>org.owasp</groupId>
-                    <artifactId>dependency-check-maven</artifactId>
-                    <version>${maven-owasp-plugin-version}</version>
-                    <executions>
-                        <execution>
-                            <phase>validate</phase>
-                            <goals>
-                                <goal>check</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
 
             </plugins>
         </pluginManagement>
@@ -406,16 +403,6 @@
                         </plugin>
                         <plugin>
                             <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-compiler-plugin</artifactId>
-                            <configuration>
-                                <fork>true</fork>
-                                <compilerArgs combine.children="append">
-                                    <arg>-J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar</arg>
-                                </compilerArgs>
-                            </configuration>
-                        </plugin>
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
                             <artifactId>maven-surefire-plugin</artifactId>
                             <version>2.21.0</version>
                             <configuration>
@@ -454,6 +441,8 @@
                             <configuration>
                                 <additionalJOptions>
                                     <additionalJOption>-Xdoclint:none</additionalJOption>
+                                    <additionalJOption>--add-modules</additionalJOption>
+                                    <additionalJOption>java.xml.bind</additionalJOption>
                                 </additionalJOptions>
                             </configuration>
                         </plugin>
@@ -472,7 +461,7 @@
                                     <exclude>**/PerformanceMemoryTest.java</exclude>
                                     <exclude>**/PerformanceTimingTest.java</exclude>
                                 </excludes>
-                                <argLine>-Xmx2000m --add-opens java.base/java.lang.reflect=ALL-UNNAMED</argLine>
+                                <argLine>-Xmx2000m --add-modules java.xml.bind --add-opens java.base/java.lang.reflect=ALL-UNNAMED</argLine>
                                 <systemPropertyVariables>
                                     <product.version>${project.version}</product.version>
                                     <log4j.configuration>log4j-xmlsec.xml</log4j.configuration>
@@ -483,24 +472,6 @@
                     </plugins>
                 </pluginManagement>
              </build>
-             <dependencies>
-                 <dependency>
-                     <groupId>javax.activation</groupId>
-                     <artifactId>activation</artifactId>
-                     <version>1.1.1</version>
-                 </dependency>
-                 <dependency>
-                     <groupId>jakarta.xml.bind</groupId>
-                     <artifactId>jakarta.xml.bind-api</artifactId>
-                     <version>2.3.2</version>
-                 </dependency>
-                 <dependency>
-                     <groupId>org.glassfish.jaxb</groupId>
-                     <artifactId>jaxb-runtime</artifactId>
-                     <version>2.3.2</version>
-                     <scope>test</scope>
-                 </dependency>
-             </dependencies>
          </profile>
         <profile>
             <!-- Profile for testing with EclipseLink MOXy based JAXB implementation -->
@@ -532,18 +503,6 @@
                 </repository>
             </repositories>
         </profile>
-        <profile>
-            <id>dependencycheck</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.owasp</groupId>
-                        <artifactId>dependency-check-maven</artifactId>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
     </profiles>
 
     <properties>
@@ -556,13 +515,12 @@
         <bcprov.version>1.60</bcprov.version>
         <xmlunit.version>1.6</xmlunit.version>
         <commons.codec.version>1.12</commons.codec.version>
-        <woodstox.core.version>5.2.0</woodstox.core.version>
+        <woodstox.core.version>5.0.3</woodstox.core.version>
         <jetty.version>9.4.8.v20171121</jetty.version>
         <xmlsec.jaxb.context.class />
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <targetJdk>1.8</targetJdk>
         <clirr.version>2.8</clirr.version>
-        <maven-owasp-plugin-version>4.0.2</maven-owasp-plugin-version>
 
         <!-- Allow Clirr severity to be overriden by the command-line option -DminSeverity=level -->
         <minSeverity>info</minSeverity>
@@ -576,18 +534,18 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
+            <groupId>com.fasterxml.woodstox</groupId>
+            <artifactId>woodstox-core</artifactId>
+            <version>${woodstox.core.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
             <version>${commons.codec.version}</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>com.fasterxml.woodstox</groupId>
-            <artifactId>woodstox-core</artifactId>
-            <version>${woodstox.core.version}</version>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <version>${slf4j.version}</version>
@@ -682,11 +640,6 @@
                     <minSeverity>${minSeverity}</minSeverity>
                 </configuration>
             </plugin>
-            <plugin>
-                <groupId>org.owasp</groupId>
-                <artifactId>dependency-check-maven</artifactId>
-                <version>${maven-owasp-plugin-version}</version>
-            </plugin>
         </plugins>
     </reporting>
 </project>
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java
index 91c5a6d..1150372 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheCanonicalizer.java
@@ -53,7 +53,7 @@
 
     private static final org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(ApacheCanonicalizer.class);
-    protected Canonicalizer canonicalizer;
+    protected Canonicalizer apacheCanonicalizer;
     private Transform apacheTransform;
     protected String inclusiveNamespaces;
     protected C14NMethodParameterSpec params;
@@ -110,11 +110,11 @@
     public Data canonicalize(Data data, XMLCryptoContext xc, OutputStream os)
         throws TransformException
     {
-        if (canonicalizer == null) {
+        if (apacheCanonicalizer == null) {
             try {
-                canonicalizer = Canonicalizer.getInstance(getAlgorithm());
+                apacheCanonicalizer = Canonicalizer.getInstance(getAlgorithm());
                 boolean secVal = Utils.secureValidation(xc);
-                canonicalizer.setSecureValidation(secVal);
+                apacheCanonicalizer.setSecureValidation(secVal);
                 LOG.debug("Created canonicalizer for algorithm: {}", getAlgorithm());
             } catch (InvalidCanonicalizerException ice) {
                 throw new TransformException
@@ -124,9 +124,9 @@
         }
 
         if (os != null) {
-            canonicalizer.setWriter(os);
+            apacheCanonicalizer.setWriter(os);
         } else {
-            canonicalizer.setWriter(new ByteArrayOutputStream());
+            apacheCanonicalizer.setWriter(new ByteArrayOutputStream());
         }
 
         try {
@@ -137,29 +137,29 @@
                 if (in.isElement()) {
                     if (inclusiveNamespaces != null) {
                         return new OctetStreamData(new ByteArrayInputStream
-                            (canonicalizer.canonicalizeSubtree
+                            (apacheCanonicalizer.canonicalizeSubtree
                                 (in.getSubNode(), inclusiveNamespaces)));
                     } else {
                         return new OctetStreamData(new ByteArrayInputStream
-                            (canonicalizer.canonicalizeSubtree
+                            (apacheCanonicalizer.canonicalizeSubtree
                                 (in.getSubNode())));
                     }
                 } else if (in.isNodeSet()) {
                     nodeSet = in.getNodeSet();
                 } else {
                     return new OctetStreamData(new ByteArrayInputStream(
-                        canonicalizer.canonicalize(
+                        apacheCanonicalizer.canonicalize(
                             Utils.readBytesFromStream(in.getOctetStream()))));
                 }
             } else if (data instanceof DOMSubTreeData) {
                 DOMSubTreeData subTree = (DOMSubTreeData)data;
                 if (inclusiveNamespaces != null) {
                     return new OctetStreamData(new ByteArrayInputStream
-                        (canonicalizer.canonicalizeSubtree
+                        (apacheCanonicalizer.canonicalizeSubtree
                          (subTree.getRoot(), inclusiveNamespaces)));
                 } else {
                     return new OctetStreamData(new ByteArrayInputStream
-                        (canonicalizer.canonicalizeSubtree
+                        (apacheCanonicalizer.canonicalizeSubtree
                          (subTree.getRoot())));
                 }
             } else if (data instanceof NodeSetData) {
@@ -171,17 +171,17 @@
                 LOG.debug("Canonicalizing {} nodes", nodeSet.size());
             } else {
                 return new OctetStreamData(new ByteArrayInputStream(
-                    canonicalizer.canonicalize(
+                    apacheCanonicalizer.canonicalize(
                         Utils.readBytesFromStream(
                         ((OctetStreamData)data).getOctetStream()))));
             }
             if (inclusiveNamespaces != null) {
                 return new OctetStreamData(new ByteArrayInputStream(
-                    canonicalizer.canonicalizeXPathNodeSet
+                    apacheCanonicalizer.canonicalizeXPathNodeSet
                         (nodeSet, inclusiveNamespaces)));
             } else {
                 return new OctetStreamData(new ByteArrayInputStream(
-                    canonicalizer.canonicalizeXPathNodeSet(nodeSet)));
+                    apacheCanonicalizer.canonicalizeXPathNodeSet(nodeSet)));
             }
         } catch (Exception e) {
             throw new TransformException(e);
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java
index 77dc7df..dbb7231 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java
@@ -68,10 +68,10 @@
                 (XMLUtils.getOwnerDocument(xi.getSubNode()));
         }
 
-        Set<Node> inputSet = new LinkedHashSet<>();
+        Set<Node> inputSet = new LinkedHashSet<Node>();
         XMLUtils.getSet(xi.getSubNode(), inputSet,
                         null, !xi.isExcludeComments());
-        Set<Node> nodeSet = new LinkedHashSet<>();
+        Set<Node> nodeSet = new LinkedHashSet<Node>();
         for (Node currentNode : inputSet) {
             Iterator<NodeFilter> it = nodeFilters.iterator();
             boolean skipNode = false;
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheTransform.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheTransform.java
index 747858c..ae584c4 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheTransform.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/ApacheTransform.java
@@ -54,7 +54,7 @@
 
     private static final org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(ApacheTransform.class);
-    private Transform transform;
+    private Transform apacheTransform;
     protected Document ownerDoc;
     protected Element transformElem;
     protected TransformParameterSpec params;
@@ -128,13 +128,13 @@
             throw new TransformException("transform must be marshalled");
         }
 
-        if (transform == null) {
+        if (apacheTransform == null) {
             try {
-                transform =
+                apacheTransform =
                     new Transform(ownerDoc, getAlgorithm(), transformElem.getChildNodes());
-                transform.setElement(transformElem, xc.getBaseURI());
+                apacheTransform.setElement(transformElem, xc.getBaseURI());
                 boolean secVal = Utils.secureValidation(xc);
-                transform.setSecureValidation(secVal);
+                apacheTransform.setSecureValidation(secVal);
                 LOG.debug("Created transform for algorithm: {}", getAlgorithm());
             } catch (Exception ex) {
                 throw new TransformException("Couldn't find Transform for: " +
@@ -182,12 +182,12 @@
 
         try {
             if (os != null) {
-                in = transform.performTransform(in, os);
+                in = apacheTransform.performTransform(in, os);
                 if (!in.isNodeSet() && !in.isElement()) {
                     return null;
                 }
             } else {
-                in = transform.performTransform(in);
+                in = apacheTransform.performTransform(in);
             }
             if (in.isOctetStream()) {
                 return new ApacheOctetStreamData(in);
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14N11Method.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14N11Method.java
index 5fa2318..ca2d61b 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14N11Method.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14N11Method.java
@@ -62,9 +62,9 @@
             DOMSubTreeData subTree = (DOMSubTreeData) data;
             if (subTree.excludeComments()) {
                 try {
-                    canonicalizer = Canonicalizer.getInstance(C14N_11);
+                    apacheCanonicalizer = Canonicalizer.getInstance(C14N_11);
                     boolean secVal = Utils.secureValidation(xc);
-                    canonicalizer.setSecureValidation(secVal);
+                    apacheCanonicalizer.setSecureValidation(secVal);
                 } catch (InvalidCanonicalizerException ice) {
                     throw new TransformException
                         ("Couldn't find Canonicalizer for: " +
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14NMethod.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14NMethod.java
index 4372cff..f8d7921 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14NMethod.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMCanonicalXMLC14NMethod.java
@@ -58,10 +58,10 @@
             DOMSubTreeData subTree = (DOMSubTreeData) data;
             if (subTree.excludeComments()) {
                 try {
-                    canonicalizer = Canonicalizer.getInstance
+                    apacheCanonicalizer = Canonicalizer.getInstance
                         (CanonicalizationMethod.INCLUSIVE);
                     boolean secVal = Utils.secureValidation(xc);
-                    canonicalizer.setSecureValidation(secVal);
+                    apacheCanonicalizer.setSecureValidation(secVal);
                 } catch (InvalidCanonicalizerException ice) {
                     throw new TransformException
                         ("Couldn't find Canonicalizer for: " +
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java
index 883564c..10c4ee6 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java
@@ -124,7 +124,7 @@
         for (int i = 0, size = prefixList.size(); i < size; i++) {
             prefixListAttr.append(prefixList.get(i));
             if (i < size - 1) {
-                prefixListAttr.append(' ');
+                prefixListAttr.append(" ");
             }
         }
         DOMUtils.setAttribute(eElem, "PrefixList", prefixListAttr.toString());
@@ -146,10 +146,10 @@
             DOMSubTreeData subTree = (DOMSubTreeData)data;
             if (subTree.excludeComments()) {
                 try {
-                    canonicalizer = Canonicalizer.getInstance
+                    apacheCanonicalizer = Canonicalizer.getInstance
                         (CanonicalizationMethod.EXCLUSIVE);
                     boolean secVal = Utils.secureValidation(xc);
-                    canonicalizer.setSecureValidation(secVal);
+                    apacheCanonicalizer.setSecureValidation(secVal);
                 } catch (InvalidCanonicalizerException ice) {
                     throw new TransformException
                         ("Couldn't find Canonicalizer for: " +
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyValue.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyValue.java
index d873df1..5311613 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyValue.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyValue.java
@@ -89,11 +89,11 @@
         }
 
         String namespace = kvtElem.getNamespaceURI();
-        if ("DSAKeyValue".equals(kvtElem.getLocalName()) && XMLSignature.XMLNS.equals(namespace)) {
+        if (kvtElem.getLocalName().equals("DSAKeyValue") && XMLSignature.XMLNS.equals(namespace)) {
             return new DSA(kvtElem);
-        } else if ("RSAKeyValue".equals(kvtElem.getLocalName()) && XMLSignature.XMLNS.equals(namespace)) {
+        } else if (kvtElem.getLocalName().equals("RSAKeyValue") && XMLSignature.XMLNS.equals(namespace)) {
             return new RSA(kvtElem);
-        } else if ("ECKeyValue".equals(kvtElem.getLocalName()) && XMLDSIG_11_XMLNS.equals(namespace)) {
+        } else if (kvtElem.getLocalName().equals("ECKeyValue") && XMLDSIG_11_XMLNS.equals(namespace)) {
             return new EC(kvtElem);
         } else {
             return new Unknown(kvtElem);
@@ -306,7 +306,7 @@
             // check for P and Q
             BigInteger p = null;
             BigInteger q = null;
-            if ("P".equals(curElem.getLocalName()) && XMLSignature.XMLNS.equals(curElem.getNamespaceURI())) {
+            if (curElem.getLocalName().equals("P") && XMLSignature.XMLNS.equals(curElem.getNamespaceURI())) {
                 p = decode(curElem);
                 curElem = DOMUtils.getNextSiblingElement(curElem, "Q", XMLSignature.XMLNS);
                 q = decode(curElem);
@@ -314,7 +314,7 @@
             }
             BigInteger g = null;
             if (curElem != null
-                && "G".equals(curElem.getLocalName()) && XMLSignature.XMLNS.equals(curElem.getNamespaceURI())) {
+                && curElem.getLocalName().equals("G") && XMLSignature.XMLNS.equals(curElem.getNamespaceURI())) {
                 g = decode(curElem);
                 curElem = DOMUtils.getNextSiblingElement(curElem, "Y", XMLSignature.XMLNS);
             }
@@ -323,7 +323,7 @@
                 y = decode(curElem);
                 curElem = DOMUtils.getNextSiblingElement(curElem);
             }
-            //if (curElem != null && "J".equals(curElem.getLocalName())) {
+            //if (curElem != null && curElem.getLocalName().equals("J")) {
                 //j = new DOMCryptoBinary(curElem.getFirstChild());
                 // curElem = DOMUtils.getNextSiblingElement(curElem);
             //}
@@ -465,11 +465,15 @@
 
         private static boolean matchCurve(ECParameterSpec params, Curve curve) {
             int fieldSize = params.getCurve().getField().getFieldSize();
-            return curve.getCurve().getField().getFieldSize() == fieldSize
+            if (curve.getCurve().getField().getFieldSize() == fieldSize
                 && curve.getCurve().equals(params.getCurve())
                 && curve.getGenerator().equals(params.getGenerator())
                 && curve.getOrder().equals(params.getOrder())
-                && curve.getCofactor() == params.getCofactor();
+                && curve.getCofactor() == params.getCofactor()) {
+                return true;
+            } else {
+                return false;
+            }
         }
 
         @Override
@@ -492,7 +496,7 @@
                 throw new MarshalException("Invalid ECParameterSpec");
             }
             DOMUtils.setAttribute(namedCurveElem, "URI", "urn:oid:" + oid);
-            String qname = (prefix == null || prefix.length() == 0)
+            String qname = prefix == null || prefix.length() == 0
                        ? "xmlns" : "xmlns:" + prefix;
             namedCurveElem.setAttributeNS("http://www.w3.org/2000/xmlns/",
                                           qname, XMLDSIG_11_XMLNS);
@@ -522,11 +526,11 @@
                 throw new MarshalException("KeyValue must contain at least one type");
             }
 
-            if ("ECParameters".equals(curElem.getLocalName())
+            if (curElem.getLocalName().equals("ECParameters")
                 && XMLDSIG_11_XMLNS.equals(curElem.getNamespaceURI())) {
                 throw new UnsupportedOperationException
                     ("ECParameters not supported");
-            } else if ("NamedCurve".equals(curElem.getLocalName())
+            } else if (curElem.getLocalName().equals("NamedCurve")
                 && XMLDSIG_11_XMLNS.equals(curElem.getNamespaceURI())) {
                 String uri = DOMUtils.getAttributeValue(curElem, "URI");
                 // strip off "urn:oid"
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java
index 43ee065..e308e2c 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java
@@ -162,7 +162,7 @@
         }
         this.digestMethod = dm;
         this.uri = uri;
-        if (uri != null && !uri.isEmpty()) {
+        if (uri != null && !uri.equals("")) {
             try {
                 new URI(uri);
             } catch (URISyntaxException e) {
@@ -193,7 +193,7 @@
         // unmarshal Transforms, if specified
         Element nextSibling = DOMUtils.getFirstChildElement(refElem);
         List<Transform> newTransforms = new ArrayList<>(MAXIMUM_TRANSFORM_COUNT);
-        if ("Transforms".equals(nextSibling.getLocalName())
+        if (nextSibling.getLocalName().equals("Transforms")
             && XMLSignature.XMLNS.equals(nextSibling.getNamespaceURI())) {
             Element transformElem = DOMUtils.getFirstChildElement(nextSibling,
                                                                   "Transform",
@@ -219,7 +219,7 @@
             }
             nextSibling = DOMUtils.getNextSiblingElement(nextSibling);
         }
-        if (!"DigestMethod".equals(nextSibling.getLocalName())
+        if (!nextSibling.getLocalName().equals("DigestMethod")
             && XMLSignature.XMLNS.equals(nextSibling.getNamespaceURI())) {
             throw new MarshalException("Invalid element name: " +
                                        nextSibling.getLocalName() +
@@ -545,7 +545,7 @@
             throw new XMLSignatureException(e);
         } catch (org.apache.xml.security.c14n.CanonicalizationException e) {
             throw new XMLSignatureException(e);
-        } finally { //NOPMD
+        } finally {
             if (dos != null) {
                 try {
                     dos.close();
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java
index a519bc1..d294e30 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java
@@ -53,6 +53,7 @@
 import javax.xml.crypto.dsig.Transform;
 import javax.xml.crypto.dsig.XMLSignature;
 import javax.xml.crypto.dsig.keyinfo.RetrievalMethod;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Attr;
@@ -108,7 +109,7 @@
             }
         }
         this.uri = uri;
-        if (!uri.isEmpty()) {
+        if (!uri.equals("")) {
             try {
                 new URI(uri);
             } catch (URISyntaxException e) {
@@ -268,12 +269,14 @@
     public XMLStructure dereferenceAsXMLStructure(XMLCryptoContext context)
         throws URIReferenceException
     {
+        DocumentBuilder db = null;
         boolean secVal = Utils.secureValidation(context);
         ApacheData data = (ApacheData)dereference(context);
         try (InputStream is = new ByteArrayInputStream(data.getXMLSignatureInput().getBytes())) {
-            Document doc = XMLUtils.read(is, secVal);
+            db = XMLUtils.createDocumentBuilder(false, secVal);
+            Document doc = db.parse(is);
             Element kiElem = doc.getDocumentElement();
-            if ("X509Data".equals(kiElem.getLocalName())
+            if (kiElem.getLocalName().equals("X509Data")
                 && XMLSignature.XMLNS.equals(kiElem.getNamespaceURI())) {
                 return new DOMX509Data(kiElem);
             } else {
@@ -281,6 +284,10 @@
             }
         } catch (Exception e) {
             throw new URIReferenceException(e);
+        } finally {
+            if (db != null) {
+                XMLUtils.repoolDocumentBuilder(db);
+            }
         }
     }
 
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMUtils.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMUtils.java
index 590b3d3..8357805 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMUtils.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMUtils.java
@@ -24,30 +24,19 @@
  */
 package org.apache.jcp.xml.dsig.internal.dom;
 
+import java.util.*;
 import java.security.spec.AlgorithmParameterSpec;
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-import javax.xml.XMLConstants;
-import javax.xml.crypto.MarshalException;
-import javax.xml.crypto.XMLCryptoContext;
-import javax.xml.crypto.XMLStructure;
-import javax.xml.crypto.dsig.XMLSignature;
-import javax.xml.crypto.dsig.spec.ExcC14NParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathFilterParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathType;
-import javax.xml.crypto.dsig.spec.XSLTTransformParameterSpec;
-
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import javax.xml.XMLConstants;
+import javax.xml.crypto.*;
+import javax.xml.crypto.dsig.*;
+import javax.xml.crypto.dsig.spec.*;
+
 /**
  * Useful static DOM utility methods.
  *
@@ -99,7 +88,7 @@
     public static Element createElement(Document doc, String tag,
                                         String nsURI, String prefix)
     {
-        String qName = (prefix == null || prefix.length() == 0)
+        String qName = prefix == null || prefix.length() == 0
                        ? tag : prefix + ":" + tag;
         return doc.createElementNS(nsURI, qName);
     }
@@ -156,6 +145,23 @@
 
     /**
      * Returns the first child element of the specified node and checks that
+     * the local name is equal to {@code localName}.
+     *
+     * @param node the node
+     * @return the first child element of the specified node
+     * @throws NullPointerException if {@code node == null}
+     * @throws MarshalException if no such element or the local name is not
+     *    equal to {@code localName}
+     */
+    @Deprecated
+    public static Element getFirstChildElement(Node node, String localName)
+        throws MarshalException
+    {
+        return verifyElement(getFirstChildElement(node), localName);
+    }
+
+    /**
+     * Returns the first child element of the specified node and checks that
      * the local name is equal to {@code localName} and the namespace is equal to
      * {@code namespaceURI}
      *
@@ -171,6 +177,20 @@
         return verifyElement(getFirstChildElement(node), localName, namespaceURI);
     }
 
+    private static Element verifyElement(Element elem, String localName)
+        throws MarshalException
+    {
+        if (elem == null) {
+            throw new MarshalException("Missing " + localName + " element");
+        }
+        String name = elem.getLocalName();
+        if (!name.equals(localName)) {
+            throw new MarshalException("Invalid element name: " +
+                                       name + ", expected " + localName);
+        }
+        return elem;
+    }
+
     private static Element verifyElement(Element elem, String localName, String namespaceURI)
         throws MarshalException
     {
@@ -223,6 +243,23 @@
 
     /**
      * Returns the next sibling element of the specified node and checks that
+     * the local name is equal to {@code localName}.
+     *
+     * @param node the node
+     * @return the next sibling element of the specified node
+     * @throws NullPointerException if {@code node == null}
+     * @throws MarshalException if no such element or the local name is not
+     * equal to {@code localName}
+     */
+    @Deprecated
+    public static Element getNextSiblingElement(Node node, String localName)
+        throws MarshalException
+    {
+        return verifyElement(getNextSiblingElement(node), localName);
+    }
+
+    /**
+     * Returns the next sibling element of the specified node and checks that
      * the local name is equal to {@code localName} and the namespace is equal to
      * {@code namespaceURI}
      *
@@ -366,9 +403,11 @@
         if (thisNode == otherNode) {
             return true;
         }
-
+        if (thisNode.getNodeType() != otherNode.getNodeType()) {
+            return false;
+        }
         // FIXME - test content, etc
-        return thisNode.getNodeType() == otherNode.getNodeType();
+        return true;
     }
 
     /**
@@ -467,7 +506,8 @@
 
     public static boolean isNamespace(Node node)
     {
-        if (Node.ATTRIBUTE_NODE == node.getNodeType()) {
+        final short nodeType = node.getNodeType();
+        if (nodeType == Node.ATTRIBUTE_NODE) {
             final String namespaceURI = node.getNamespaceURI();
             return XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI);
         }
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMX509Data.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMX509Data.java
index 80599ae..15a8ae8 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMX509Data.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMX509Data.java
@@ -26,16 +26,8 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.security.cert.CRLException;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509CRL;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.security.cert.*;
+import java.util.*;
 
 import javax.security.auth.x500.X500Principal;
 import javax.xml.crypto.MarshalException;
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLSignature.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLSignature.java
index 568b5bf..64f8a13 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLSignature.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLSignature.java
@@ -147,7 +147,7 @@
 
         // unmarshal KeyInfo, if specified
         Element nextSibling = DOMUtils.getNextSiblingElement(sigValElem);
-        if (nextSibling != null && "KeyInfo".equals(nextSibling.getLocalName())
+        if (nextSibling != null && nextSibling.getLocalName().equals("KeyInfo")
             && XMLSignature.XMLNS.equals(nextSibling.getNamespaceURI())) {
             ki = new DOMKeyInfo(nextSibling, context, provider);
             nextSibling = DOMUtils.getNextSiblingElement(nextSibling);
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java
index 686ddc8..57188fb 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathFilter2Transform.java
@@ -31,21 +31,17 @@
  */
 package org.apache.jcp.xml.dsig.internal.dom;
 
+import javax.xml.crypto.*;
+import javax.xml.crypto.dsig.*;
+import javax.xml.crypto.dsig.spec.TransformParameterSpec;
+import javax.xml.crypto.dsig.spec.XPathType;
+import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec;
 import java.security.InvalidAlgorithmParameterException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
-import javax.xml.crypto.MarshalException;
-import javax.xml.crypto.XMLCryptoContext;
-import javax.xml.crypto.XMLStructure;
-import javax.xml.crypto.dsig.Transform;
-import javax.xml.crypto.dsig.spec.TransformParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathType;
-
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathTransform.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathTransform.java
index e2e37f5..34e4905 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathTransform.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXPathTransform.java
@@ -24,18 +24,14 @@
  */
 package org.apache.jcp.xml.dsig.internal.dom;
 
+import javax.xml.crypto.*;
+import javax.xml.crypto.dsig.*;
+import javax.xml.crypto.dsig.spec.TransformParameterSpec;
+import javax.xml.crypto.dsig.spec.XPathFilterParameterSpec;
 import java.security.InvalidAlgorithmParameterException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-
-import javax.xml.crypto.MarshalException;
-import javax.xml.crypto.XMLCryptoContext;
-import javax.xml.crypto.XMLStructure;
-import javax.xml.crypto.dsig.XMLSignature;
-import javax.xml.crypto.dsig.spec.TransformParameterSpec;
-import javax.xml.crypto.dsig.spec.XPathFilterParameterSpec;
-
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/XMLDSigRI.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/XMLDSigRI.java
index d3f3f56..395f82e 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/XMLDSigRI.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/XMLDSigRI.java
@@ -63,13 +63,13 @@
         ProviderService(Provider p, String type, String algo, String cn,
             String[] aliases) {
             super(p, type, algo, cn,
-                aliases == null ? null : Arrays.asList(aliases), null);
+                (aliases == null? null : Arrays.asList(aliases)), null);
         }
 
         ProviderService(Provider p, String type, String algo, String cn,
-            String[] aliases, Map<String, String> attrs) {
+            String[] aliases, HashMap<String, String> attrs) {
             super(p, type, algo, cn,
-                  aliases == null ? null : Arrays.asList(aliases), attrs);
+                  (aliases == null? null : Arrays.asList(aliases)), attrs);
         }
 
         @Override
@@ -83,20 +83,20 @@
 
             String algo = getAlgorithm();
             try {
-                if ("XMLSignatureFactory".equals(type)) {
-                    if ("DOM".equals(algo)) {
+                if (type.equals("XMLSignatureFactory")) {
+                    if (algo.equals("DOM")) {
                         return new DOMXMLSignatureFactory();
                     }
-                } else if ("KeyInfoFactory".equals(type)) {
-                    if ("DOM".equals(algo)) {
+                } else if (type.equals("KeyInfoFactory")) {
+                    if (algo.equals("DOM")) {
                         return new DOMKeyInfoFactory();
                     }
-                } else if ("TransformService".equals(type)) {
+                } else if (type.equals("TransformService")) {
                     if (algo.equals(CanonicalizationMethod.INCLUSIVE) ||
                         algo.equals(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS)) {
                         return new DOMCanonicalXMLC14NMethod();
-                    } else if ("http://www.w3.org/2006/12/xml-c14n11".equals(algo) ||
-                        "http://www.w3.org/2006/12/xml-c14n11#WithComments".equals(algo)) {
+                    } else if (algo.equals("http://www.w3.org/2006/12/xml-c14n11") ||
+                        algo.equals("http://www.w3.org/2006/12/xml-c14n11#WithComments")) {
                         return new DOMCanonicalXMLC14N11Method();
                     } else if (algo.equals(CanonicalizationMethod.EXCLUSIVE) ||
                         algo.equals(CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS)) {
@@ -124,12 +124,12 @@
 
     public XMLDSigRI() {
         /* We are the ApacheXMLDSig provider */
-        super("ApacheXMLDSig", 2.20, INFO);
+        super("ApacheXMLDSig", 2.13, INFO);
 
         final Provider p = this;
         AccessController.doPrivileged(new PrivilegedAction<Void>() {
             public Void run() {
-                Map<String, String> MECH_TYPE = new HashMap<>();
+                HashMap<String, String> MECH_TYPE = new HashMap<>();
                 MECH_TYPE.put("MechanismType", "DOM");
 
                 putService(new ProviderService(p, "XMLSignatureFactory",
diff --git a/src/main/java/org/apache/xml/security/Init.java b/src/main/java/org/apache/xml/security/Init.java
index 0d2f55d..5e65229 100644
--- a/src/main/java/org/apache/xml/security/Init.java
+++ b/src/main/java/org/apache/xml/security/Init.java
@@ -18,13 +18,14 @@
  */
 package org.apache.xml.security;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.algorithms.JCEMapper;
 import org.apache.xml.security.algorithms.SignatureAlgorithm;
 import org.apache.xml.security.c14n.Canonicalizer;
@@ -91,11 +92,6 @@
             dynamicInit();
         } else {
             fileInit(is);
-            try {
-                is.close();
-            } catch (IOException ex) {
-                LOG.warn(ex.getMessage());
-            }
         }
 
         alreadyInitialized = true;
@@ -159,7 +155,14 @@
     private static void fileInit(InputStream is) {
         try {
             /* read library configuration file */
-            Document doc = XMLUtils.read(is, false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc;
+            try {
+                doc = db.parse(is);
+            } finally {
+                XMLUtils.repoolDocumentBuilder(db);
+                db = null;
+            }
             Node config = doc.getFirstChild();
             for (; config != null; config = config.getNextSibling()) {
                 if ("Configuration".equals(config.getLocalName())) {
@@ -199,7 +202,7 @@
                             Canonicalizer.register(uri, javaClass);
                             LOG.debug("Canonicalizer.register({}, {})", uri, javaClass);
                         } catch (ClassNotFoundException e) {
-                            Object[] exArgs = { uri, javaClass };
+                            Object exArgs[] = { uri, javaClass };
                             LOG.error(I18n.translate("algorithm.classDoesNotExist", exArgs));
                         }
                     }
@@ -217,7 +220,7 @@
                             Transform.register(uri, javaClass);
                             LOG.debug("Transform.register({}, {})", uri, javaClass);
                         } catch (ClassNotFoundException e) {
-                            Object[] exArgs = { uri, javaClass };
+                            Object exArgs[] = { uri, javaClass };
 
                             LOG.error(I18n.translate("algorithm.classDoesNotExist", exArgs));
                         } catch (NoClassDefFoundError ex) {
@@ -253,7 +256,7 @@
                             SignatureAlgorithm.register(uri, javaClass);
                             LOG.debug("SignatureAlgorithm.register({}, {})", uri, javaClass);
                         } catch (ClassNotFoundException e) {
-                            Object[] exArgs = { uri, javaClass };
+                            Object exArgs[] = { uri, javaClass };
 
                             LOG.error(I18n.translate("algorithm.classDoesNotExist", exArgs));
                         }
diff --git a/src/main/java/org/apache/xml/security/algorithms/JCEMapper.java b/src/main/java/org/apache/xml/security/algorithms/JCEMapper.java
index 75339b4..878f37d 100644
--- a/src/main/java/org/apache/xml/security/algorithms/JCEMapper.java
+++ b/src/main/java/org/apache/xml/security/algorithms/JCEMapper.java
@@ -35,7 +35,8 @@
     private static final org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(JCEMapper.class);
 
-    private static Map<String, Algorithm> algorithmsMap = new ConcurrentHashMap<>();
+    private static Map<String, Algorithm> algorithmsMap =
+        new ConcurrentHashMap<String, Algorithm>();
 
     private static String providerName;
 
diff --git a/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java b/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java
index 894a3d7..e431cf4 100644
--- a/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java
+++ b/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java
@@ -33,7 +33,7 @@
  * MessageDigestAlgorithm.getInstance()
  * </pre>
  */
-public final class MessageDigestAlgorithm extends Algorithm {
+public class MessageDigestAlgorithm extends Algorithm {
 
     /** Message Digest - NOT RECOMMENDED MD5*/
     public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 =
@@ -165,7 +165,7 @@
      * @param input
      * @return the result of the {@link java.security.MessageDigest#digest(byte[])} method
      */
-    public byte[] digest(byte[] input) {
+    public byte[] digest(byte input[]) {
         return algorithm.digest(input);
     }
 
@@ -179,7 +179,7 @@
      * @return the result of the {@link java.security.MessageDigest#digest(byte[], int, int)} method
      * @throws java.security.DigestException
      */
-    public int digest(byte[] buf, int offset, int len) throws java.security.DigestException {
+    public int digest(byte buf[], int offset, int len) throws java.security.DigestException {
         return algorithm.digest(buf, offset, len);
     }
 
@@ -250,7 +250,7 @@
      * @param offset
      * @param len
      */
-    public void update(byte[] buf, int offset, int len) {
+    public void update(byte buf[], int offset, int len) {
         algorithm.update(buf, offset, len);
     }
 
diff --git a/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java b/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
index 36716923..05259d7 100644
--- a/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
+++ b/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
@@ -51,10 +51,10 @@
 
     /** All available algorithm classes are registered here */
     private static Map<String, Class<? extends SignatureAlgorithmSpi>> algorithmHash =
-        new ConcurrentHashMap<>();
+        new ConcurrentHashMap<String, Class<? extends SignatureAlgorithmSpi>>();
 
     /** Field signatureAlgorithm */
-    private final SignatureAlgorithmSpi signatureAlgorithmSpi;
+    private final SignatureAlgorithmSpi signatureAlgorithm;
 
     private final String algorithmURI;
 
@@ -69,8 +69,8 @@
         super(doc, algorithmURI);
         this.algorithmURI = algorithmURI;
 
-        signatureAlgorithmSpi = getSignatureAlgorithmSpi(algorithmURI);
-        signatureAlgorithmSpi.engineGetContextFromElement(getElement());
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(getElement());
     }
 
     /**
@@ -87,11 +87,11 @@
         super(doc, algorithmURI);
         this.algorithmURI = algorithmURI;
 
-        signatureAlgorithmSpi = getSignatureAlgorithmSpi(algorithmURI);
-        signatureAlgorithmSpi.engineGetContextFromElement(getElement());
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(getElement());
 
-        signatureAlgorithmSpi.engineSetHMACOutputLength(hmacOutputLength);
-        ((IntegrityHmac)signatureAlgorithmSpi).engineAddContextToElement(getElement());
+        signatureAlgorithm.engineSetHMACOutputLength(hmacOutputLength);
+        ((IntegrityHmac)signatureAlgorithm).engineAddContextToElement(getElement());
     }
 
     /**
@@ -126,13 +126,13 @@
 
         if (secureValidation && (XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5.equals(algorithmURI)
             || XMLSignature.ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5.equals(algorithmURI))) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
 
             throw new XMLSecurityException("signature.signatureAlgorithm", exArgs);
         }
 
-        signatureAlgorithmSpi = getSignatureAlgorithmSpi(algorithmURI);
-        signatureAlgorithmSpi.engineGetContextFromElement(getElement());
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(getElement());
     }
 
     /**
@@ -145,12 +145,12 @@
                 algorithmHash.get(algorithmURI);
             LOG.debug("Create URI \"{}\" class \"{}\"", algorithmURI, implementingClass);
             if (implementingClass == null) {
-                Object[] exArgs = { algorithmURI };
+                Object exArgs[] = { algorithmURI };
                 throw new XMLSignatureException("algorithms.NoSuchAlgorithmNoEx", exArgs);
             }
             return implementingClass.newInstance();
         }  catch (IllegalAccessException | InstantiationException | NullPointerException ex) {
-            Object[] exArgs = { algorithmURI, ex.getMessage() };
+            Object exArgs[] = { algorithmURI, ex.getMessage() };
             throw new XMLSignatureException(ex, "algorithms.NoSuchAlgorithm", exArgs);
         }
     }
@@ -164,7 +164,7 @@
      * @throws XMLSignatureException
      */
     public byte[] sign() throws XMLSignatureException {
-        return signatureAlgorithmSpi.engineSign();
+        return signatureAlgorithm.engineSign();
     }
 
     /**
@@ -174,7 +174,7 @@
      * @return the result of the {@link java.security.Signature#getAlgorithm} method
      */
     public String getJCEAlgorithmString() {
-        return signatureAlgorithmSpi.engineGetJCEAlgorithmString();
+        return signatureAlgorithm.engineGetJCEAlgorithmString();
     }
 
     /**
@@ -183,7 +183,7 @@
      * @return The Provider of this Signature Algorithm
      */
     public String getJCEProviderName() {
-        return signatureAlgorithmSpi.engineGetJCEProviderName();
+        return signatureAlgorithm.engineGetJCEProviderName();
     }
 
     /**
@@ -194,7 +194,7 @@
      * @throws XMLSignatureException
      */
     public void update(byte[] input) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineUpdate(input);
+        signatureAlgorithm.engineUpdate(input);
     }
 
     /**
@@ -205,7 +205,7 @@
      * @throws XMLSignatureException
      */
     public void update(byte input) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineUpdate(input);
+        signatureAlgorithm.engineUpdate(input);
     }
 
     /**
@@ -217,8 +217,8 @@
      * @param len
      * @throws XMLSignatureException
      */
-    public void update(byte[] buf, int offset, int len) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineUpdate(buf, offset, len);
+    public void update(byte buf[], int offset, int len) throws XMLSignatureException {
+        signatureAlgorithm.engineUpdate(buf, offset, len);
     }
 
     /**
@@ -229,7 +229,7 @@
      * @throws XMLSignatureException
      */
     public void initSign(Key signingKey) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineInitSign(signingKey);
+        signatureAlgorithm.engineInitSign(signingKey);
     }
 
     /**
@@ -242,7 +242,7 @@
      * @throws XMLSignatureException
      */
     public void initSign(Key signingKey, SecureRandom secureRandom) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineInitSign(signingKey, secureRandom);
+        signatureAlgorithm.engineInitSign(signingKey, secureRandom);
     }
 
     /**
@@ -256,7 +256,7 @@
     public void initSign(
         Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
     ) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineInitSign(signingKey, algorithmParameterSpec);
+        signatureAlgorithm.engineInitSign(signingKey, algorithmParameterSpec);
     }
 
     /**
@@ -268,7 +268,7 @@
      * @throws XMLSignatureException
      */
     public void setParameter(AlgorithmParameterSpec params) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineSetParameter(params);
+        signatureAlgorithm.engineSetParameter(params);
     }
 
     /**
@@ -279,7 +279,7 @@
      * @throws XMLSignatureException
      */
     public void initVerify(Key verificationKey) throws XMLSignatureException {
-        signatureAlgorithmSpi.engineInitVerify(verificationKey);
+        signatureAlgorithm.engineInitVerify(verificationKey);
     }
 
     /**
@@ -292,7 +292,7 @@
      * @throws XMLSignatureException
      */
     public boolean verify(byte[] signature) throws XMLSignatureException {
-        return signatureAlgorithmSpi.engineVerify(signature);
+        return signatureAlgorithm.engineVerify(signature);
     }
 
     /**
@@ -325,7 +325,7 @@
         // are we already registered?
         Class<? extends SignatureAlgorithmSpi> registeredClass = algorithmHash.get(algorithmURI);
         if (registeredClass != null) {
-            Object[] exArgs = { algorithmURI, registeredClass };
+            Object exArgs[] = { algorithmURI, registeredClass };
             throw new AlgorithmAlreadyRegisteredException(
                 "algorithm.alreadyRegistered", exArgs
             );
@@ -336,7 +336,7 @@
                     ClassLoaderUtils.loadClass(implementingClass, SignatureAlgorithm.class);
             algorithmHash.put(algorithmURI, clazz);
         } catch (NullPointerException ex) {
-            Object[] exArgs = { algorithmURI, ex.getMessage() };
+            Object exArgs[] = { algorithmURI, ex.getMessage() };
             throw new XMLSignatureException(ex, "algorithms.NoSuchAlgorithm", exArgs);
         }
     }
@@ -361,7 +361,7 @@
         // are we already registered?
         Class<? extends SignatureAlgorithmSpi> registeredClass = algorithmHash.get(algorithmURI);
         if (registeredClass != null) {
-            Object[] exArgs = { algorithmURI, registeredClass };
+            Object exArgs[] = { algorithmURI, registeredClass };
             throw new AlgorithmAlreadyRegisteredException(
                 "algorithm.alreadyRegistered", exArgs
             );
diff --git a/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithmSpi.java b/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithmSpi.java
index 679e9bf..c1921fc 100644
--- a/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithmSpi.java
+++ b/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithmSpi.java
@@ -76,7 +76,7 @@
      * @param len
      * @throws XMLSignatureException
      */
-    protected abstract void engineUpdate(byte[] buf, int offset, int len)
+    protected abstract void engineUpdate(byte buf[], int offset, int len)
         throws XMLSignatureException;
 
     /**
diff --git a/src/main/java/org/apache/xml/security/algorithms/implementations/ECDSAUtils.java b/src/main/java/org/apache/xml/security/algorithms/implementations/ECDSAUtils.java
index 2523540..c541c71 100644
--- a/src/main/java/org/apache/xml/security/algorithms/implementations/ECDSAUtils.java
+++ b/src/main/java/org/apache/xml/security/algorithms/implementations/ECDSAUtils.java
@@ -44,7 +44,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertASN1toXMLDSIG(byte[] asn1Bytes) throws IOException {
+    public static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
 
         if (asn1Bytes.length < 8 || asn1Bytes[0] != 48) {
             throw new IOException("Invalid ASN.1 format of ECDSA signature");
@@ -76,7 +76,7 @@
                 || asn1Bytes[offset + 2 + rLength] != 2) {
             throw new IOException("Invalid ASN.1 format of ECDSA signature");
         }
-        byte[] xmldsigBytes = new byte[2 * rawLen];
+        byte xmldsigBytes[] = new byte[2 * rawLen];
 
         System.arraycopy(asn1Bytes, offset + 2 + rLength - i, xmldsigBytes, rawLen - i, i);
         System.arraycopy(asn1Bytes, offset + 2 + rLength + 2 + sLength - j, xmldsigBytes,
@@ -97,7 +97,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertXMLDSIGtoASN1(byte[] xmldsigBytes) throws IOException {
+    public static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
 
         int rawLen = xmldsigBytes.length / 2;
 
@@ -126,7 +126,7 @@
             throw new IOException("Invalid XMLDSIG format of ECDSA signature");
         }
         int offset;
-        byte[] asn1Bytes;
+        byte asn1Bytes[];
         if (len < 128) {
             asn1Bytes = new byte[2 + 2 + j + 2 + l];
             offset = 1;
@@ -873,9 +873,9 @@
 
     public static byte[] encodePoint(ECPoint ecPoint, EllipticCurve ellipticCurve) {
         int size = (ellipticCurve.getField().getFieldSize() + 7) / 8;
-        byte[] affineXBytes = stripLeadingZeros(ecPoint.getAffineX().toByteArray());
-        byte[] affineYBytes = stripLeadingZeros(ecPoint.getAffineY().toByteArray());
-        byte[] encodedBytes = new byte[size * 2 + 1];
+        byte affineXBytes[] = stripLeadingZeros(ecPoint.getAffineX().toByteArray());
+        byte affineYBytes[] = stripLeadingZeros(ecPoint.getAffineY().toByteArray());
+        byte encodedBytes[] = new byte[size * 2 + 1];
         encodedBytes[0] = 0x04; //uncompressed
         System.arraycopy(affineXBytes, 0, encodedBytes, size - affineXBytes.length + 1, affineXBytes.length);
         System.arraycopy(affineYBytes, 0, encodedBytes, encodedBytes.length - affineYBytes.length, affineYBytes.length);
@@ -888,8 +888,8 @@
         }
 
         int size = (elliptiCcurve.getField().getFieldSize() + 7) / 8;
-        byte[] affineXBytes = new byte[size];
-        byte[] affineYBytes = new byte[size];
+        byte affineXBytes[] = new byte[size];
+        byte affineYBytes[] = new byte[size];
         System.arraycopy(encodedBytes, 1, affineXBytes, 0, size);
         System.arraycopy(encodedBytes, size + 1, affineYBytes, 0, size);
         return new ECPoint(new BigInteger(1, affineXBytes), new BigInteger(1, affineYBytes));
@@ -906,7 +906,7 @@
         if (i == 0) {
             return bytes;
         } else {
-            byte[] stripped = new byte[bytes.length - i];
+            byte stripped[] = new byte[bytes.length - i];
             System.arraycopy(bytes, i, stripped, 0, stripped.length);
             return stripped;
         }
diff --git a/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java b/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java
index 282cb05..c6b6dd6 100644
--- a/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java
+++ b/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java
@@ -136,7 +136,7 @@
                 supplied = secretKey.getClass().getName();
             }
             String needed = SecretKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -205,7 +205,7 @@
                 supplied = secretKey.getClass().getName();
             }
             String needed = SecretKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -274,7 +274,7 @@
      * @param len
      * @throws XMLSignatureException
      */
-    protected void engineUpdate(byte[] buf, int offset, int len) throws XMLSignatureException {
+    protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
         try {
             this.macAlgorithm.update(buf, offset, len);
         } catch (IllegalStateException ex) {
diff --git a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureBaseRSA.java b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureBaseRSA.java
index ee089c5..9d21945 100644
--- a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureBaseRSA.java
+++ b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureBaseRSA.java
@@ -99,7 +99,7 @@
                 supplied = publicKey.getClass().getName();
             }
             String needed = PublicKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -140,7 +140,7 @@
                 supplied = privateKey.getClass().getName();
             }
             String needed = PrivateKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -180,7 +180,7 @@
     }
 
     /** {@inheritDoc} */
-    protected void engineUpdate(byte[] buf, int offset, int len) throws XMLSignatureException {
+    protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
         try {
             this.signatureAlgorithm.update(buf, offset, len);
         } catch (SignatureException ex) {
diff --git a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureDSA.java b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureDSA.java
index c22f755..476765f 100644
--- a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureDSA.java
+++ b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureDSA.java
@@ -129,7 +129,7 @@
                 supplied = publicKey.getClass().getName();
             }
             String needed = PublicKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -158,7 +158,7 @@
      */
     protected byte[] engineSign() throws XMLSignatureException {
         try {
-            byte[] jcebytes = this.signatureAlgorithm.sign();
+            byte jcebytes[] = this.signatureAlgorithm.sign();
 
             return JavaUtils.convertDsaASN1toXMLDSIG(jcebytes, size/8);
         } catch (IOException ex) {
@@ -179,7 +179,7 @@
                 supplied = privateKey.getClass().getName();
             }
             String needed = PrivateKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -228,7 +228,7 @@
     /**
      * {@inheritDoc}
      */
-    protected void engineUpdate(byte[] buf, int offset, int len) throws XMLSignatureException {
+    protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
         try {
             this.signatureAlgorithm.update(buf, offset, len);
         } catch (SignatureException ex) {
diff --git a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureECDSA.java b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureECDSA.java
index 0b79e11..b68ed1d 100644
--- a/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureECDSA.java
+++ b/src/main/java/org/apache/xml/security/algorithms/implementations/SignatureECDSA.java
@@ -63,7 +63,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertASN1toXMLDSIG(byte[] asn1Bytes) throws IOException {
+    public static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
         return ECDSAUtils.convertASN1toXMLDSIG(asn1Bytes);
     }
 
@@ -80,7 +80,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertXMLDSIGtoASN1(byte[] xmldsigBytes) throws IOException {
+    public static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
         return ECDSAUtils.convertXMLDSIGtoASN1(xmldsigBytes);
     }
 
@@ -148,7 +148,7 @@
                 supplied = publicKey.getClass().getName();
             }
             String needed = PublicKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -174,7 +174,7 @@
     /** {@inheritDoc} */
     protected byte[] engineSign() throws XMLSignatureException {
         try {
-            byte[] jcebytes = this.signatureAlgorithm.sign();
+            byte jcebytes[] = this.signatureAlgorithm.sign();
 
             return SignatureECDSA.convertASN1toXMLDSIG(jcebytes);
         } catch (SignatureException ex) {
@@ -193,7 +193,7 @@
                 supplied = privateKey.getClass().getName();
             }
             String needed = PrivateKey.class.getName();
-            Object[] exArgs = { supplied, needed };
+            Object exArgs[] = { supplied, needed };
 
             throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
         }
@@ -233,7 +233,7 @@
     }
 
     /** {@inheritDoc} */
-    protected void engineUpdate(byte[] buf, int offset, int len) throws XMLSignatureException {
+    protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
         try {
             this.signatureAlgorithm.update(buf, offset, len);
         } catch (SignatureException ex) {
diff --git a/src/main/java/org/apache/xml/security/binding/excc14n/InclusiveNamespaces.java b/src/main/java/org/apache/xml/security/binding/excc14n/InclusiveNamespaces.java
new file mode 100644
index 0000000..7094128
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/excc14n/InclusiveNamespaces.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.excc14n;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for InclusiveNamespaces complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="InclusiveNamespaces"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;attribute name="PrefixList"&gt;
+ *         &lt;simpleType&gt;
+ *           &lt;list itemType="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *         &lt;/simpleType&gt;
+ *       &lt;/attribute&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "InclusiveNamespaces", namespace = "http://www.w3.org/2001/10/xml-exc-c14n#")
+public class InclusiveNamespaces {
+
+    @XmlAttribute(name = "PrefixList")
+    protected List<String> prefixList;
+
+    /**
+     * Gets the value of the prefixList property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the prefixList property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getPrefixList().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     *
+     *
+     */
+    public List<String> getPrefixList() {
+        if (prefixList == null) {
+            prefixList = new ArrayList<String>();
+        }
+        return this.prefixList;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/excc14n/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/excc14n/ObjectFactory.java
new file mode 100644
index 0000000..7dcc0aa
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/excc14n/ObjectFactory.java
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.excc14n;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.excc14n package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _InclusiveNamespaces_QNAME = new QName("http://www.w3.org/2001/10/xml-exc-c14n#", "InclusiveNamespaces");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.excc14n
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link InclusiveNamespaces }
+     *
+     */
+    public InclusiveNamespaces createInclusiveNamespaces() {
+        return new InclusiveNamespaces();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link InclusiveNamespaces }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/10/xml-exc-c14n#", name = "InclusiveNamespaces")
+    public JAXBElement<InclusiveNamespaces> createInclusiveNamespaces(InclusiveNamespaces value) {
+        return new JAXBElement<InclusiveNamespaces>(_InclusiveNamespaces_QNAME, InclusiveNamespaces.class, null, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/CanonicalizationMethodType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/CanonicalizationMethodType.java
new file mode 100644
index 0000000..b7f5618
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/CanonicalizationMethodType.java
@@ -0,0 +1,127 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for CanonicalizationMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CanonicalizationMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;any maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CanonicalizationMethodType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class CanonicalizationMethodType {
+
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/DSAKeyValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/DSAKeyValueType.java
new file mode 100644
index 0000000..cb6a91b
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/DSAKeyValueType.java
@@ -0,0 +1,245 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for DSAKeyValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="DSAKeyValueType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;sequence minOccurs="0"&gt;
+ *           &lt;element name="P" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *           &lt;element name="Q" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;/sequence&gt;
+ *         &lt;element name="G" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary" minOccurs="0"/&gt;
+ *         &lt;element name="Y" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;element name="J" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary" minOccurs="0"/&gt;
+ *         &lt;sequence minOccurs="0"&gt;
+ *           &lt;element name="Seed" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *           &lt;element name="PgenCounter" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;/sequence&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DSAKeyValueType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "p",
+    "q",
+    "g",
+    "y",
+    "j",
+    "seed",
+    "pgenCounter"
+})
+public class DSAKeyValueType {
+
+    @XmlElement(name = "P", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] p;
+    @XmlElement(name = "Q", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] q;
+    @XmlElement(name = "G", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] g;
+    @XmlElement(name = "Y", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected byte[] y;
+    @XmlElement(name = "J", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] j;
+    @XmlElement(name = "Seed", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] seed;
+    @XmlElement(name = "PgenCounter", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected byte[] pgenCounter;
+
+    /**
+     * Gets the value of the p property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getP() {
+        return p;
+    }
+
+    /**
+     * Sets the value of the p property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setP(byte[] value) {
+        this.p = value;
+    }
+
+    /**
+     * Gets the value of the q property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getQ() {
+        return q;
+    }
+
+    /**
+     * Sets the value of the q property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setQ(byte[] value) {
+        this.q = value;
+    }
+
+    /**
+     * Gets the value of the g property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getG() {
+        return g;
+    }
+
+    /**
+     * Sets the value of the g property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setG(byte[] value) {
+        this.g = value;
+    }
+
+    /**
+     * Gets the value of the y property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getY() {
+        return y;
+    }
+
+    /**
+     * Sets the value of the y property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setY(byte[] value) {
+        this.y = value;
+    }
+
+    /**
+     * Gets the value of the j property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getJ() {
+        return j;
+    }
+
+    /**
+     * Sets the value of the j property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setJ(byte[] value) {
+        this.j = value;
+    }
+
+    /**
+     * Gets the value of the seed property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getSeed() {
+        return seed;
+    }
+
+    /**
+     * Sets the value of the seed property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setSeed(byte[] value) {
+        this.seed = value;
+    }
+
+    /**
+     * Gets the value of the pgenCounter property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getPgenCounter() {
+        return pgenCounter;
+    }
+
+    /**
+     * Sets the value of the pgenCounter property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setPgenCounter(byte[] value) {
+        this.pgenCounter = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/DigestMethodType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/DigestMethodType.java
new file mode 100644
index 0000000..509cdc6
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/DigestMethodType.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for DigestMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="DigestMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DigestMethodType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class DigestMethodType {
+
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/KeyInfoType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/KeyInfoType.java
new file mode 100644
index 0000000..7cb25ed
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/KeyInfoType.java
@@ -0,0 +1,160 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for KeyInfoType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="KeyInfoType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice maxOccurs="unbounded"&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}KeyName"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}KeyValue"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}RetrievalMethod"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}X509Data"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}PGPData"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}SPKIData"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}MgmtData"/&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "KeyInfoType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class KeyInfoType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "X509Data", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "KeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "RetrievalMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "MgmtData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "PGPData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "SPKIData", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "KeyName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    })
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link X509DataType }{@code >}
+     * {@link Element }
+     * {@link JAXBElement }{@code <}{@link KeyValueType }{@code >}
+     * {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >}
+     * {@link JAXBElement }{@code <}{@link String }{@code >}
+     * {@link JAXBElement }{@code <}{@link PGPDataType }{@code >}
+     * {@link String }
+     * {@link Object }
+     * {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >}
+     * {@link JAXBElement }{@code <}{@link String }{@code >}
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/KeyValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/KeyValueType.java
new file mode 100644
index 0000000..d6c423f
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/KeyValueType.java
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for KeyValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="KeyValueType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}DSAKeyValue"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}RSAKeyValue"/&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *       &lt;/choice&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "KeyValueType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class KeyValueType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "RSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "DSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    })
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     * {@link Element }
+     * {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >}
+     * {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >}
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/ManifestType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/ManifestType.java
new file mode 100644
index 0000000..2946819
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/ManifestType.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for ManifestType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ManifestType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Reference" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ManifestType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "reference"
+})
+public class ManifestType {
+
+    @XmlElement(name = "Reference", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected List<ReferenceType> reference;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the reference property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the reference property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getReference().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link ReferenceType }
+     *
+     *
+     */
+    public List<ReferenceType> getReference() {
+        if (reference == null) {
+            reference = new ArrayList<ReferenceType>();
+        }
+        return this.reference;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectFactory.java
new file mode 100644
index 0000000..174a8b3
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectFactory.java
@@ -0,0 +1,577 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.math.BigInteger;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.xmldsig package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _Signature_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Signature");
+    private final static QName _SignatureValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureValue");
+    private final static QName _SignedInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignedInfo");
+    private final static QName _CanonicalizationMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "CanonicalizationMethod");
+    private final static QName _SignatureMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureMethod");
+    private final static QName _Reference_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Reference");
+    private final static QName _Transforms_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transforms");
+    private final static QName _Transform_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Transform");
+    private final static QName _DigestMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestMethod");
+    private final static QName _DigestValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DigestValue");
+    private final static QName _KeyInfo_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyInfo");
+    private final static QName _KeyName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyName");
+    private final static QName _MgmtData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "MgmtData");
+    private final static QName _KeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "KeyValue");
+    private final static QName _RetrievalMethod_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RetrievalMethod");
+    private final static QName _X509Data_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Data");
+    private final static QName _PGPData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPData");
+    private final static QName _SPKIData_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKIData");
+    private final static QName _Object_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Object");
+    private final static QName _Manifest_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "Manifest");
+    private final static QName _SignatureProperties_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperties");
+    private final static QName _SignatureProperty_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SignatureProperty");
+    private final static QName _DSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "DSAKeyValue");
+    private final static QName _RSAKeyValue_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "RSAKeyValue");
+    private final static QName _SPKIDataTypeSPKISexp_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "SPKISexp");
+    private final static QName _PGPDataTypePGPKeyID_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyID");
+    private final static QName _PGPDataTypePGPKeyPacket_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "PGPKeyPacket");
+    private final static QName _X509DataTypeX509IssuerSerial_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509IssuerSerial");
+    private final static QName _X509DataTypeX509SKI_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SKI");
+    private final static QName _X509DataTypeX509SubjectName_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509SubjectName");
+    private final static QName _X509DataTypeX509Certificate_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509Certificate");
+    private final static QName _X509DataTypeX509CRL_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "X509CRL");
+    private final static QName _TransformTypeXPath_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "XPath");
+    private final static QName _SignatureMethodTypeHMACOutputLength_QNAME = new QName("http://www.w3.org/2000/09/xmldsig#", "HMACOutputLength");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.xmldsig
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link SignatureType }
+     *
+     */
+    public SignatureType createSignatureType() {
+        return new SignatureType();
+    }
+
+    /**
+     * Create an instance of {@link SignatureValueType }
+     *
+     */
+    public SignatureValueType createSignatureValueType() {
+        return new SignatureValueType();
+    }
+
+    /**
+     * Create an instance of {@link SignedInfoType }
+     *
+     */
+    public SignedInfoType createSignedInfoType() {
+        return new SignedInfoType();
+    }
+
+    /**
+     * Create an instance of {@link CanonicalizationMethodType }
+     *
+     */
+    public CanonicalizationMethodType createCanonicalizationMethodType() {
+        return new CanonicalizationMethodType();
+    }
+
+    /**
+     * Create an instance of {@link SignatureMethodType }
+     *
+     */
+    public SignatureMethodType createSignatureMethodType() {
+        return new SignatureMethodType();
+    }
+
+    /**
+     * Create an instance of {@link ReferenceType }
+     *
+     */
+    public ReferenceType createReferenceType() {
+        return new ReferenceType();
+    }
+
+    /**
+     * Create an instance of {@link TransformsType }
+     *
+     */
+    public TransformsType createTransformsType() {
+        return new TransformsType();
+    }
+
+    /**
+     * Create an instance of {@link TransformType }
+     *
+     */
+    public TransformType createTransformType() {
+        return new TransformType();
+    }
+
+    /**
+     * Create an instance of {@link DigestMethodType }
+     *
+     */
+    public DigestMethodType createDigestMethodType() {
+        return new DigestMethodType();
+    }
+
+    /**
+     * Create an instance of {@link KeyInfoType }
+     *
+     */
+    public KeyInfoType createKeyInfoType() {
+        return new KeyInfoType();
+    }
+
+    /**
+     * Create an instance of {@link KeyValueType }
+     *
+     */
+    public KeyValueType createKeyValueType() {
+        return new KeyValueType();
+    }
+
+    /**
+     * Create an instance of {@link RetrievalMethodType }
+     *
+     */
+    public RetrievalMethodType createRetrievalMethodType() {
+        return new RetrievalMethodType();
+    }
+
+    /**
+     * Create an instance of {@link X509DataType }
+     *
+     */
+    public X509DataType createX509DataType() {
+        return new X509DataType();
+    }
+
+    /**
+     * Create an instance of {@link PGPDataType }
+     *
+     */
+    public PGPDataType createPGPDataType() {
+        return new PGPDataType();
+    }
+
+    /**
+     * Create an instance of {@link SPKIDataType }
+     *
+     */
+    public SPKIDataType createSPKIDataType() {
+        return new SPKIDataType();
+    }
+
+    /**
+     * Create an instance of {@link ObjectType }
+     *
+     */
+    public ObjectType createObjectType() {
+        return new ObjectType();
+    }
+
+    /**
+     * Create an instance of {@link ManifestType }
+     *
+     */
+    public ManifestType createManifestType() {
+        return new ManifestType();
+    }
+
+    /**
+     * Create an instance of {@link SignaturePropertiesType }
+     *
+     */
+    public SignaturePropertiesType createSignaturePropertiesType() {
+        return new SignaturePropertiesType();
+    }
+
+    /**
+     * Create an instance of {@link SignaturePropertyType }
+     *
+     */
+    public SignaturePropertyType createSignaturePropertyType() {
+        return new SignaturePropertyType();
+    }
+
+    /**
+     * Create an instance of {@link DSAKeyValueType }
+     *
+     */
+    public DSAKeyValueType createDSAKeyValueType() {
+        return new DSAKeyValueType();
+    }
+
+    /**
+     * Create an instance of {@link RSAKeyValueType }
+     *
+     */
+    public RSAKeyValueType createRSAKeyValueType() {
+        return new RSAKeyValueType();
+    }
+
+    /**
+     * Create an instance of {@link X509IssuerSerialType }
+     *
+     */
+    public X509IssuerSerialType createX509IssuerSerialType() {
+        return new X509IssuerSerialType();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignatureType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Signature")
+    public JAXBElement<SignatureType> createSignature(SignatureType value) {
+        return new JAXBElement<SignatureType>(_Signature_QNAME, SignatureType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignatureValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureValue")
+    public JAXBElement<SignatureValueType> createSignatureValue(SignatureValueType value) {
+        return new JAXBElement<SignatureValueType>(_SignatureValue_QNAME, SignatureValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignedInfoType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignedInfo")
+    public JAXBElement<SignedInfoType> createSignedInfo(SignedInfoType value) {
+        return new JAXBElement<SignedInfoType>(_SignedInfo_QNAME, SignedInfoType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link CanonicalizationMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "CanonicalizationMethod")
+    public JAXBElement<CanonicalizationMethodType> createCanonicalizationMethod(CanonicalizationMethodType value) {
+        return new JAXBElement<CanonicalizationMethodType>(_CanonicalizationMethod_QNAME, CanonicalizationMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignatureMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureMethod")
+    public JAXBElement<SignatureMethodType> createSignatureMethod(SignatureMethodType value) {
+        return new JAXBElement<SignatureMethodType>(_SignatureMethod_QNAME, SignatureMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Reference")
+    public JAXBElement<ReferenceType> createReference(ReferenceType value) {
+        return new JAXBElement<ReferenceType>(_Reference_QNAME, ReferenceType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link TransformsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transforms")
+    public JAXBElement<TransformsType> createTransforms(TransformsType value) {
+        return new JAXBElement<TransformsType>(_Transforms_QNAME, TransformsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link TransformType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Transform")
+    public JAXBElement<TransformType> createTransform(TransformType value) {
+        return new JAXBElement<TransformType>(_Transform_QNAME, TransformType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link DigestMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestMethod")
+    public JAXBElement<DigestMethodType> createDigestMethod(DigestMethodType value) {
+        return new JAXBElement<DigestMethodType>(_DigestMethod_QNAME, DigestMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DigestValue")
+    public JAXBElement<byte[]> createDigestValue(byte[] value) {
+        return new JAXBElement<byte[]>(_DigestValue_QNAME, byte[].class, null, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyInfo")
+    public JAXBElement<KeyInfoType> createKeyInfo(KeyInfoType value) {
+        return new JAXBElement<KeyInfoType>(_KeyInfo_QNAME, KeyInfoType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyName")
+    public JAXBElement<String> createKeyName(String value) {
+        return new JAXBElement<String>(_KeyName_QNAME, String.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "MgmtData")
+    public JAXBElement<String> createMgmtData(String value) {
+        return new JAXBElement<String>(_MgmtData_QNAME, String.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "KeyValue")
+    public JAXBElement<KeyValueType> createKeyValue(KeyValueType value) {
+        return new JAXBElement<KeyValueType>(_KeyValue_QNAME, KeyValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RetrievalMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RetrievalMethod")
+    public JAXBElement<RetrievalMethodType> createRetrievalMethod(RetrievalMethodType value) {
+        return new JAXBElement<RetrievalMethodType>(_RetrievalMethod_QNAME, RetrievalMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link X509DataType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Data")
+    public JAXBElement<X509DataType> createX509Data(X509DataType value) {
+        return new JAXBElement<X509DataType>(_X509Data_QNAME, X509DataType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link PGPDataType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPData")
+    public JAXBElement<PGPDataType> createPGPData(PGPDataType value) {
+        return new JAXBElement<PGPDataType>(_PGPData_QNAME, PGPDataType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SPKIDataType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKIData")
+    public JAXBElement<SPKIDataType> createSPKIData(SPKIDataType value) {
+        return new JAXBElement<SPKIDataType>(_SPKIData_QNAME, SPKIDataType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ObjectType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Object")
+    public JAXBElement<ObjectType> createObject(ObjectType value) {
+        return new JAXBElement<ObjectType>(_Object_QNAME, ObjectType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ManifestType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "Manifest")
+    public JAXBElement<ManifestType> createManifest(ManifestType value) {
+        return new JAXBElement<ManifestType>(_Manifest_QNAME, ManifestType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertiesType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperties")
+    public JAXBElement<SignaturePropertiesType> createSignatureProperties(SignaturePropertiesType value) {
+        return new JAXBElement<SignaturePropertiesType>(_SignatureProperties_QNAME, SignaturePropertiesType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SignaturePropertyType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SignatureProperty")
+    public JAXBElement<SignaturePropertyType> createSignatureProperty(SignaturePropertyType value) {
+        return new JAXBElement<SignaturePropertyType>(_SignatureProperty_QNAME, SignaturePropertyType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link DSAKeyValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "DSAKeyValue")
+    public JAXBElement<DSAKeyValueType> createDSAKeyValue(DSAKeyValueType value) {
+        return new JAXBElement<DSAKeyValueType>(_DSAKeyValue_QNAME, DSAKeyValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link RSAKeyValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "RSAKeyValue")
+    public JAXBElement<RSAKeyValueType> createRSAKeyValue(RSAKeyValueType value) {
+        return new JAXBElement<RSAKeyValueType>(_RSAKeyValue_QNAME, RSAKeyValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "SPKISexp", scope = SPKIDataType.class)
+    public JAXBElement<byte[]> createSPKIDataTypeSPKISexp(byte[] value) {
+        return new JAXBElement<byte[]>(_SPKIDataTypeSPKISexp_QNAME, byte[].class, SPKIDataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyID", scope = PGPDataType.class)
+    public JAXBElement<byte[]> createPGPDataTypePGPKeyID(byte[] value) {
+        return new JAXBElement<byte[]>(_PGPDataTypePGPKeyID_QNAME, byte[].class, PGPDataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "PGPKeyPacket", scope = PGPDataType.class)
+    public JAXBElement<byte[]> createPGPDataTypePGPKeyPacket(byte[] value) {
+        return new JAXBElement<byte[]>(_PGPDataTypePGPKeyPacket_QNAME, byte[].class, PGPDataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509IssuerSerial", scope = X509DataType.class)
+    public JAXBElement<X509IssuerSerialType> createX509DataTypeX509IssuerSerial(X509IssuerSerialType value) {
+        return new JAXBElement<X509IssuerSerialType>(_X509DataTypeX509IssuerSerial_QNAME, X509IssuerSerialType.class, X509DataType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SKI", scope = X509DataType.class)
+    public JAXBElement<byte[]> createX509DataTypeX509SKI(byte[] value) {
+        return new JAXBElement<byte[]>(_X509DataTypeX509SKI_QNAME, byte[].class, X509DataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509SubjectName", scope = X509DataType.class)
+    public JAXBElement<String> createX509DataTypeX509SubjectName(String value) {
+        return new JAXBElement<String>(_X509DataTypeX509SubjectName_QNAME, String.class, X509DataType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509Certificate", scope = X509DataType.class)
+    public JAXBElement<byte[]> createX509DataTypeX509Certificate(byte[] value) {
+        return new JAXBElement<byte[]>(_X509DataTypeX509Certificate_QNAME, byte[].class, X509DataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "X509CRL", scope = X509DataType.class)
+    public JAXBElement<byte[]> createX509DataTypeX509CRL(byte[] value) {
+        return new JAXBElement<byte[]>(_X509DataTypeX509CRL_QNAME, byte[].class, X509DataType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "XPath", scope = TransformType.class)
+    public JAXBElement<String> createTransformTypeXPath(String value) {
+        return new JAXBElement<String>(_TransformTypeXPath_QNAME, String.class, TransformType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link BigInteger }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2000/09/xmldsig#", name = "HMACOutputLength", scope = SignatureMethodType.class)
+    public JAXBElement<BigInteger> createSignatureMethodTypeHMACOutputLength(BigInteger value) {
+        return new JAXBElement<BigInteger>(_SignatureMethodTypeHMACOutputLength_QNAME, BigInteger.class, SignatureMethodType.class, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectType.java
new file mode 100644
index 0000000..727a36a
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/ObjectType.java
@@ -0,0 +1,189 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for ObjectType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ObjectType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence maxOccurs="unbounded" minOccurs="0"&gt;
+ *         &lt;any processContents='lax'/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *       &lt;attribute name="MimeType" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="Encoding" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ObjectType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class ObjectType {
+
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+    @XmlAttribute(name = "MimeType")
+    protected String mimeType;
+    @XmlAttribute(name = "Encoding")
+    @XmlSchemaType(name = "anyURI")
+    protected String encoding;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets the value of the mimeType property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getMimeType() {
+        return mimeType;
+    }
+
+    /**
+     * Sets the value of the mimeType property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setMimeType(String value) {
+        this.mimeType = value;
+    }
+
+    /**
+     * Gets the value of the encoding property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getEncoding() {
+        return encoding;
+    }
+
+    /**
+     * Sets the value of the encoding property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setEncoding(String value) {
+        this.encoding = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/PGPDataType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/PGPDataType.java
new file mode 100644
index 0000000..ac72a2b
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/PGPDataType.java
@@ -0,0 +1,123 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for PGPDataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="PGPDataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;sequence&gt;
+ *           &lt;element name="PGPKeyID" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *           &lt;element name="PGPKeyPacket" type="{http://www.w3.org/2001/XMLSchema}base64Binary" minOccurs="0"/&gt;
+ *           &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;/sequence&gt;
+ *         &lt;sequence&gt;
+ *           &lt;element name="PGPKeyPacket" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *           &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;/sequence&gt;
+ *       &lt;/choice&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PGPDataType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class PGPDataType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "PGPKeyID", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "PGPKeyPacket", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    })
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+
+    /**
+     * Gets the rest of the content model.
+     *
+     * <p>
+     * You are getting this "catch-all" property because of the following reason:
+     * The field name "PGPKeyPacket" is used by two different parts of a schema. See:
+     * line 218 of file:/home/colm/src/apache/santuario-java/src/main/resources/bindings/schemas/xmldsig-core-schema.xsd
+     * line 213 of file:/home/colm/src/apache/santuario-java/src/main/resources/bindings/schemas/xmldsig-core-schema.xsd
+     * <p>
+     * To get rid of this property, apply a property customization to one
+     * of both of the following declarations to change their names:
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Object }
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link Element }
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/RSAKeyValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/RSAKeyValueType.java
new file mode 100644
index 0000000..4d0a1c8
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/RSAKeyValueType.java
@@ -0,0 +1,111 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for RSAKeyValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="RSAKeyValueType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Modulus" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;element name="Exponent" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "RSAKeyValueType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "modulus",
+    "exponent"
+})
+public class RSAKeyValueType {
+
+    @XmlElement(name = "Modulus", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected byte[] modulus;
+    @XmlElement(name = "Exponent", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected byte[] exponent;
+
+    /**
+     * Gets the value of the modulus property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getModulus() {
+        return modulus;
+    }
+
+    /**
+     * Sets the value of the modulus property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setModulus(byte[] value) {
+        this.modulus = value;
+    }
+
+    /**
+     * Gets the value of the exponent property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getExponent() {
+        return exponent;
+    }
+
+    /**
+     * Sets the value of the exponent property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setExponent(byte[] value) {
+        this.exponent = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/ReferenceType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/ReferenceType.java
new file mode 100644
index 0000000..1053951
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/ReferenceType.java
@@ -0,0 +1,232 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for ReferenceType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ReferenceType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Transforms" minOccurs="0"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}DigestMethod"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}DigestValue"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *       &lt;attribute name="URI" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ReferenceType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "transforms",
+    "digestMethod",
+    "digestValue"
+})
+public class ReferenceType {
+
+    @XmlElement(name = "Transforms", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected TransformsType transforms;
+    @XmlElement(name = "DigestMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected DigestMethodType digestMethod;
+    @XmlElement(name = "DigestValue", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected byte[] digestValue;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+    @XmlAttribute(name = "URI")
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+    @XmlAttribute(name = "Type")
+    @XmlSchemaType(name = "anyURI")
+    protected String type;
+
+    /**
+     * Gets the value of the transforms property.
+     *
+     * @return
+     *     possible object is
+     *     {@link TransformsType }
+     *
+     */
+    public TransformsType getTransforms() {
+        return transforms;
+    }
+
+    /**
+     * Sets the value of the transforms property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link TransformsType }
+     *
+     */
+    public void setTransforms(TransformsType value) {
+        this.transforms = value;
+    }
+
+    /**
+     * Gets the value of the digestMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link DigestMethodType }
+     *
+     */
+    public DigestMethodType getDigestMethod() {
+        return digestMethod;
+    }
+
+    /**
+     * Sets the value of the digestMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link DigestMethodType }
+     *
+     */
+    public void setDigestMethod(DigestMethodType value) {
+        this.digestMethod = value;
+    }
+
+    /**
+     * Gets the value of the digestValue property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getDigestValue() {
+        return digestValue;
+    }
+
+    /**
+     * Sets the value of the digestValue property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setDigestValue(byte[] value) {
+        this.digestValue = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the type property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Sets the value of the type property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setType(String value) {
+        this.type = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/RetrievalMethodType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/RetrievalMethodType.java
new file mode 100644
index 0000000..b0553a8
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/RetrievalMethodType.java
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for RetrievalMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="RetrievalMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Transforms" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="URI" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "RetrievalMethodType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "transforms"
+})
+public class RetrievalMethodType {
+
+    @XmlElement(name = "Transforms", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected TransformsType transforms;
+    @XmlAttribute(name = "URI")
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+    @XmlAttribute(name = "Type")
+    @XmlSchemaType(name = "anyURI")
+    protected String type;
+
+    /**
+     * Gets the value of the transforms property.
+     *
+     * @return
+     *     possible object is
+     *     {@link TransformsType }
+     *
+     */
+    public TransformsType getTransforms() {
+        return transforms;
+    }
+
+    /**
+     * Sets the value of the transforms property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link TransformsType }
+     *
+     */
+    public void setTransforms(TransformsType value) {
+        this.transforms = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the type property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Sets the value of the type property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setType(String value) {
+        this.type = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SPKIDataType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SPKIDataType.java
new file mode 100644
index 0000000..cbdaeb0
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SPKIDataType.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for SPKIDataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SPKIDataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence maxOccurs="unbounded"&gt;
+ *         &lt;element name="SPKISexp" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *         &lt;any processContents='lax' namespace='##other' minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SPKIDataType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "spkiSexpAndAny"
+})
+public class SPKIDataType {
+
+    @XmlElementRef(name = "SPKISexp", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    @XmlAnyElement(lax = true)
+    protected List<Object> spkiSexpAndAny;
+
+    /**
+     * Gets the value of the spkiSexpAndAny property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the spkiSexpAndAny property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getSPKISexpAndAny().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getSPKISexpAndAny() {
+        if (spkiSexpAndAny == null) {
+            spkiSexpAndAny = new ArrayList<Object>();
+        }
+        return this.spkiSexpAndAny;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureMethodType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureMethodType.java
new file mode 100644
index 0000000..57e2801
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureMethodType.java
@@ -0,0 +1,133 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for SignatureMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignatureMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="HMACOutputLength" type="{http://www.w3.org/2000/09/xmldsig#}HMACOutputLengthType" minOccurs="0"/&gt;
+ *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignatureMethodType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class SignatureMethodType {
+
+    @XmlElementRef(name = "HMACOutputLength", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link JAXBElement }{@code <}{@link BigInteger }{@code >}
+     * {@link Object }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertiesType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertiesType.java
new file mode 100644
index 0000000..72c28d5
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertiesType.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for SignaturePropertiesType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignaturePropertiesType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureProperty" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignaturePropertiesType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "signatureProperty"
+})
+public class SignaturePropertiesType {
+
+    @XmlElement(name = "SignatureProperty", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected List<SignaturePropertyType> signatureProperty;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the signatureProperty property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the signatureProperty property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getSignatureProperty().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link SignaturePropertyType }
+     *
+     *
+     */
+    public List<SignaturePropertyType> getSignatureProperty() {
+        if (signatureProperty == null) {
+            signatureProperty = new ArrayList<SignaturePropertyType>();
+        }
+        return this.signatureProperty;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertyType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertyType.java
new file mode 100644
index 0000000..159692e
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignaturePropertyType.java
@@ -0,0 +1,162 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for SignaturePropertyType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignaturePropertyType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice maxOccurs="unbounded"&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="Target" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignaturePropertyType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class SignaturePropertyType {
+
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Target", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String target;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the target property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getTarget() {
+        return target;
+    }
+
+    /**
+     * Sets the value of the target property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setTarget(String value) {
+        this.target = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureType.java
new file mode 100644
index 0000000..adcec30
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureType.java
@@ -0,0 +1,213 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for SignatureType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignatureType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}SignedInfo"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureValue"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}KeyInfo" minOccurs="0"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Object" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignatureType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "signedInfo",
+    "signatureValue",
+    "keyInfo",
+    "object"
+})
+public class SignatureType {
+
+    @XmlElement(name = "SignedInfo", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected SignedInfoType signedInfo;
+    @XmlElement(name = "SignatureValue", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected SignatureValueType signatureValue;
+    @XmlElement(name = "KeyInfo", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected KeyInfoType keyInfo;
+    @XmlElement(name = "Object", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected List<ObjectType> object;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the signedInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link SignedInfoType }
+     *
+     */
+    public SignedInfoType getSignedInfo() {
+        return signedInfo;
+    }
+
+    /**
+     * Sets the value of the signedInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link SignedInfoType }
+     *
+     */
+    public void setSignedInfo(SignedInfoType value) {
+        this.signedInfo = value;
+    }
+
+    /**
+     * Gets the value of the signatureValue property.
+     *
+     * @return
+     *     possible object is
+     *     {@link SignatureValueType }
+     *
+     */
+    public SignatureValueType getSignatureValue() {
+        return signatureValue;
+    }
+
+    /**
+     * Sets the value of the signatureValue property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link SignatureValueType }
+     *
+     */
+    public void setSignatureValue(SignatureValueType value) {
+        this.signatureValue = value;
+    }
+
+    /**
+     * Gets the value of the keyInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link KeyInfoType }
+     *
+     */
+    public KeyInfoType getKeyInfo() {
+        return keyInfo;
+    }
+
+    /**
+     * Sets the value of the keyInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link KeyInfoType }
+     *
+     */
+    public void setKeyInfo(KeyInfoType value) {
+        this.keyInfo = value;
+    }
+
+    /**
+     * Gets the value of the object property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the object property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getObject().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link ObjectType }
+     *
+     *
+     */
+    public List<ObjectType> getObject() {
+        if (object == null) {
+            object = new ArrayList<ObjectType>();
+        }
+        return this.object;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureValueType.java
new file mode 100644
index 0000000..206efea9
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignatureValueType.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for SignatureValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignatureValueType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;base64Binary"&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignatureValueType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "value"
+})
+public class SignatureValueType {
+
+    @XmlValue
+    protected byte[] value;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the value property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setValue(byte[] value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/SignedInfoType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/SignedInfoType.java
new file mode 100644
index 0000000..a44bf83
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/SignedInfoType.java
@@ -0,0 +1,185 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for SignedInfoType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="SignedInfoType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}CanonicalizationMethod"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}SignatureMethod"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Reference" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SignedInfoType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "canonicalizationMethod",
+    "signatureMethod",
+    "reference"
+})
+public class SignedInfoType {
+
+    @XmlElement(name = "CanonicalizationMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected CanonicalizationMethodType canonicalizationMethod;
+    @XmlElement(name = "SignatureMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected SignatureMethodType signatureMethod;
+    @XmlElement(name = "Reference", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected List<ReferenceType> reference;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the canonicalizationMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CanonicalizationMethodType }
+     *
+     */
+    public CanonicalizationMethodType getCanonicalizationMethod() {
+        return canonicalizationMethod;
+    }
+
+    /**
+     * Sets the value of the canonicalizationMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CanonicalizationMethodType }
+     *
+     */
+    public void setCanonicalizationMethod(CanonicalizationMethodType value) {
+        this.canonicalizationMethod = value;
+    }
+
+    /**
+     * Gets the value of the signatureMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link SignatureMethodType }
+     *
+     */
+    public SignatureMethodType getSignatureMethod() {
+        return signatureMethod;
+    }
+
+    /**
+     * Sets the value of the signatureMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link SignatureMethodType }
+     *
+     */
+    public void setSignatureMethod(SignatureMethodType value) {
+        this.signatureMethod = value;
+    }
+
+    /**
+     * Gets the value of the reference property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the reference property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getReference().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link ReferenceType }
+     *
+     *
+     */
+    public List<ReferenceType> getReference() {
+        if (reference == null) {
+            reference = new ArrayList<ReferenceType>();
+        }
+        return this.reference;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/TransformType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/TransformType.java
new file mode 100644
index 0000000..3fac2fb
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/TransformType.java
@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for TransformType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="TransformType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice maxOccurs="unbounded" minOccurs="0"&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *         &lt;element name="XPath" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TransformType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "content"
+})
+public class TransformType {
+
+    @XmlElementRef(name = "XPath", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link JAXBElement }{@code <}{@link String }{@code >}
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/TransformsType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/TransformsType.java
new file mode 100644
index 0000000..d185055
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/TransformsType.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for TransformsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="TransformsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Transform" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TransformsType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "transform"
+})
+public class TransformsType {
+
+    @XmlElement(name = "Transform", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected List<TransformType> transform;
+
+    /**
+     * Gets the value of the transform property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the transform property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getTransform().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link TransformType }
+     *
+     *
+     */
+    public List<TransformType> getTransform() {
+        if (transform == null) {
+            transform = new ArrayList<TransformType>();
+        }
+        return this.transform;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/X509DataType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/X509DataType.java
new file mode 100644
index 0000000..f55a377
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/X509DataType.java
@@ -0,0 +1,118 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for X509DataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="X509DataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence maxOccurs="unbounded"&gt;
+ *         &lt;choice&gt;
+ *           &lt;element name="X509IssuerSerial" type="{http://www.w3.org/2000/09/xmldsig#}X509IssuerSerialType"/&gt;
+ *           &lt;element name="X509SKI" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *           &lt;element name="X509SubjectName" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
+ *           &lt;element name="X509Certificate" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *           &lt;element name="X509CRL" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *           &lt;any processContents='lax' namespace='##other'/&gt;
+ *         &lt;/choice&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "X509DataType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "x509IssuerSerialOrX509SKIOrX509SubjectName"
+})
+public class X509DataType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "X509Certificate", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "X509IssuerSerial", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "X509CRL", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "X509SKI", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class),
+        @XmlElementRef(name = "X509SubjectName", namespace = "http://www.w3.org/2000/09/xmldsig#", type = JAXBElement.class)
+    })
+    @XmlAnyElement(lax = true)
+    protected List<Object> x509IssuerSerialOrX509SKIOrX509SubjectName;
+
+    /**
+     * Gets the value of the x509IssuerSerialOrX509SKIOrX509SubjectName property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the x509IssuerSerialOrX509SKIOrX509SubjectName property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getX509IssuerSerialOrX509SKIOrX509SubjectName().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link Element }
+     * {@link JAXBElement }{@code <}{@link X509IssuerSerialType }{@code >}
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link Object }
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link JAXBElement }{@code <}{@link String }{@code >}
+     *
+     *
+     */
+    public List<Object> getX509IssuerSerialOrX509SKIOrX509SubjectName() {
+        if (x509IssuerSerialOrX509SKIOrX509SubjectName == null) {
+            x509IssuerSerialOrX509SKIOrX509SubjectName = new ArrayList<Object>();
+        }
+        return this.x509IssuerSerialOrX509SKIOrX509SubjectName;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig/X509IssuerSerialType.java b/src/main/java/org/apache/xml/security/binding/xmldsig/X509IssuerSerialType.java
new file mode 100644
index 0000000..9d82f2f
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig/X509IssuerSerialType.java
@@ -0,0 +1,116 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for X509IssuerSerialType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="X509IssuerSerialType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="X509IssuerName" type="{http://www.w3.org/2001/XMLSchema}string"/&gt;
+ *         &lt;element name="X509SerialNumber" type="{http://www.w3.org/2001/XMLSchema}integer"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "X509IssuerSerialType", namespace = "http://www.w3.org/2000/09/xmldsig#", propOrder = {
+    "x509IssuerName",
+    "x509SerialNumber"
+})
+public class X509IssuerSerialType {
+
+    @XmlElement(name = "X509IssuerName", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected String x509IssuerName;
+    @XmlElement(name = "X509SerialNumber", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected BigInteger x509SerialNumber;
+
+    /**
+     * Gets the value of the x509IssuerName property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getX509IssuerName() {
+        return x509IssuerName;
+    }
+
+    /**
+     * Sets the value of the x509IssuerName property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setX509IssuerName(String value) {
+        this.x509IssuerName = value;
+    }
+
+    /**
+     * Gets the value of the x509SerialNumber property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getX509SerialNumber() {
+        return x509SerialNumber;
+    }
+
+    /**
+     * Sets the value of the x509SerialNumber property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setX509SerialNumber(BigInteger value) {
+        this.x509SerialNumber = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/CharTwoFieldParamsType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/CharTwoFieldParamsType.java
new file mode 100644
index 0000000..81eb6b0
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/CharTwoFieldParamsType.java
@@ -0,0 +1,95 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for CharTwoFieldParamsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CharTwoFieldParamsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="M" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CharTwoFieldParamsType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "m"
+})
+@XmlSeeAlso({
+    TnBFieldParamsType.class,
+    PnBFieldParamsType.class
+})
+public class CharTwoFieldParamsType {
+
+    @XmlElement(name = "M", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger m;
+
+    /**
+     * Gets the value of the m property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getM() {
+        return m;
+    }
+
+    /**
+     * Sets the value of the m property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setM(BigInteger value) {
+        this.m = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/CurveType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/CurveType.java
new file mode 100644
index 0000000..4944fdd
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/CurveType.java
@@ -0,0 +1,111 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for CurveType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CurveType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="A" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;element name="B" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CurveType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "a",
+    "b"
+})
+public class CurveType {
+
+    @XmlElement(name = "A", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] a;
+    @XmlElement(name = "B", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] b;
+
+    /**
+     * Gets the value of the a property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getA() {
+        return a;
+    }
+
+    /**
+     * Sets the value of the a property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setA(byte[] value) {
+        this.a = value;
+    }
+
+    /**
+     * Gets the value of the b property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getB() {
+        return b;
+    }
+
+    /**
+     * Sets the value of the b property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setB(byte[] value) {
+        this.b = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/DEREncodedKeyValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/DEREncodedKeyValueType.java
new file mode 100644
index 0000000..eb04919
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/DEREncodedKeyValueType.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for DEREncodedKeyValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="DEREncodedKeyValueType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;base64Binary"&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DEREncodedKeyValueType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "value"
+})
+public class DEREncodedKeyValueType {
+
+    @XmlValue
+    protected byte[] value;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the value property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setValue(byte[] value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/ECKeyValueType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECKeyValueType.java
new file mode 100644
index 0000000..0e4b975
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECKeyValueType.java
@@ -0,0 +1,178 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for ECKeyValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ECKeyValueType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;choice&gt;
+ *           &lt;element name="ECParameters" type="{http://www.w3.org/2009/xmldsig11#}ECParametersType"/&gt;
+ *           &lt;element name="NamedCurve" type="{http://www.w3.org/2009/xmldsig11#}NamedCurveType"/&gt;
+ *         &lt;/choice&gt;
+ *         &lt;element name="PublicKey" type="{http://www.w3.org/2009/xmldsig11#}ECPointType"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ECKeyValueType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "ecParameters",
+    "namedCurve",
+    "publicKey"
+})
+public class ECKeyValueType {
+
+    @XmlElement(name = "ECParameters", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected ECParametersType ecParameters;
+    @XmlElement(name = "NamedCurve", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected NamedCurveType namedCurve;
+    @XmlElement(name = "PublicKey", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] publicKey;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the ecParameters property.
+     *
+     * @return
+     *     possible object is
+     *     {@link ECParametersType }
+     *
+     */
+    public ECParametersType getECParameters() {
+        return ecParameters;
+    }
+
+    /**
+     * Sets the value of the ecParameters property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link ECParametersType }
+     *
+     */
+    public void setECParameters(ECParametersType value) {
+        this.ecParameters = value;
+    }
+
+    /**
+     * Gets the value of the namedCurve property.
+     *
+     * @return
+     *     possible object is
+     *     {@link NamedCurveType }
+     *
+     */
+    public NamedCurveType getNamedCurve() {
+        return namedCurve;
+    }
+
+    /**
+     * Sets the value of the namedCurve property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link NamedCurveType }
+     *
+     */
+    public void setNamedCurve(NamedCurveType value) {
+        this.namedCurve = value;
+    }
+
+    /**
+     * Gets the value of the publicKey property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getPublicKey() {
+        return publicKey;
+    }
+
+    /**
+     * Sets the value of the publicKey property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setPublicKey(byte[] value) {
+        this.publicKey = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/ECParametersType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECParametersType.java
new file mode 100644
index 0000000..1286bd0
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECParametersType.java
@@ -0,0 +1,224 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ECParametersType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ECParametersType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="FieldID" type="{http://www.w3.org/2009/xmldsig11#}FieldIDType"/&gt;
+ *         &lt;element name="Curve" type="{http://www.w3.org/2009/xmldsig11#}CurveType"/&gt;
+ *         &lt;element name="Base" type="{http://www.w3.org/2009/xmldsig11#}ECPointType"/&gt;
+ *         &lt;element name="Order" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *         &lt;element name="CoFactor" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/&gt;
+ *         &lt;element name="ValidationData" type="{http://www.w3.org/2009/xmldsig11#}ECValidationDataType" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ECParametersType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "fieldID",
+    "curve",
+    "base",
+    "order",
+    "coFactor",
+    "validationData"
+})
+public class ECParametersType {
+
+    @XmlElement(name = "FieldID", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected FieldIDType fieldID;
+    @XmlElement(name = "Curve", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected CurveType curve;
+    @XmlElement(name = "Base", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] base;
+    @XmlElement(name = "Order", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] order;
+    @XmlElement(name = "CoFactor", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected BigInteger coFactor;
+    @XmlElement(name = "ValidationData", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected ECValidationDataType validationData;
+
+    /**
+     * Gets the value of the fieldID property.
+     *
+     * @return
+     *     possible object is
+     *     {@link FieldIDType }
+     *
+     */
+    public FieldIDType getFieldID() {
+        return fieldID;
+    }
+
+    /**
+     * Sets the value of the fieldID property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link FieldIDType }
+     *
+     */
+    public void setFieldID(FieldIDType value) {
+        this.fieldID = value;
+    }
+
+    /**
+     * Gets the value of the curve property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CurveType }
+     *
+     */
+    public CurveType getCurve() {
+        return curve;
+    }
+
+    /**
+     * Sets the value of the curve property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CurveType }
+     *
+     */
+    public void setCurve(CurveType value) {
+        this.curve = value;
+    }
+
+    /**
+     * Gets the value of the base property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getBase() {
+        return base;
+    }
+
+    /**
+     * Sets the value of the base property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setBase(byte[] value) {
+        this.base = value;
+    }
+
+    /**
+     * Gets the value of the order property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getOrder() {
+        return order;
+    }
+
+    /**
+     * Sets the value of the order property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setOrder(byte[] value) {
+        this.order = value;
+    }
+
+    /**
+     * Gets the value of the coFactor property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getCoFactor() {
+        return coFactor;
+    }
+
+    /**
+     * Sets the value of the coFactor property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setCoFactor(BigInteger value) {
+        this.coFactor = value;
+    }
+
+    /**
+     * Gets the value of the validationData property.
+     *
+     * @return
+     *     possible object is
+     *     {@link ECValidationDataType }
+     *
+     */
+    public ECValidationDataType getValidationData() {
+        return validationData;
+    }
+
+    /**
+     * Sets the value of the validationData property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link ECValidationDataType }
+     *
+     */
+    public void setValidationData(ECValidationDataType value) {
+        this.validationData = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/ECValidationDataType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECValidationDataType.java
new file mode 100644
index 0000000..5146d04
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/ECValidationDataType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ECValidationDataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ECValidationDataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="seed" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="hashAlgorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ECValidationDataType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "seed"
+})
+public class ECValidationDataType {
+
+    @XmlElement(namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] seed;
+    @XmlAttribute(name = "hashAlgorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String hashAlgorithm;
+
+    /**
+     * Gets the value of the seed property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getSeed() {
+        return seed;
+    }
+
+    /**
+     * Sets the value of the seed property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setSeed(byte[] value) {
+        this.seed = value;
+    }
+
+    /**
+     * Gets the value of the hashAlgorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getHashAlgorithm() {
+        return hashAlgorithm;
+    }
+
+    /**
+     * Sets the value of the hashAlgorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setHashAlgorithm(String value) {
+        this.hashAlgorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/FieldIDType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/FieldIDType.java
new file mode 100644
index 0000000..f5b40d0
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/FieldIDType.java
@@ -0,0 +1,203 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for FieldIDType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="FieldIDType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}Prime"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}TnB"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}PnB"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}GnB"/&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *       &lt;/choice&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "FieldIDType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "prime",
+    "tnB",
+    "pnB",
+    "gnB",
+    "any"
+})
+public class FieldIDType {
+
+    @XmlElement(name = "Prime", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected PrimeFieldParamsType prime;
+    @XmlElement(name = "TnB", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected TnBFieldParamsType tnB;
+    @XmlElement(name = "PnB", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected PnBFieldParamsType pnB;
+    @XmlElement(name = "GnB", namespace = "http://www.w3.org/2009/xmldsig11#")
+    protected CharTwoFieldParamsType gnB;
+    @XmlAnyElement(lax = true)
+    protected Object any;
+
+    /**
+     * Gets the value of the prime property.
+     *
+     * @return
+     *     possible object is
+     *     {@link PrimeFieldParamsType }
+     *
+     */
+    public PrimeFieldParamsType getPrime() {
+        return prime;
+    }
+
+    /**
+     * Sets the value of the prime property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link PrimeFieldParamsType }
+     *
+     */
+    public void setPrime(PrimeFieldParamsType value) {
+        this.prime = value;
+    }
+
+    /**
+     * Gets the value of the tnB property.
+     *
+     * @return
+     *     possible object is
+     *     {@link TnBFieldParamsType }
+     *
+     */
+    public TnBFieldParamsType getTnB() {
+        return tnB;
+    }
+
+    /**
+     * Sets the value of the tnB property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link TnBFieldParamsType }
+     *
+     */
+    public void setTnB(TnBFieldParamsType value) {
+        this.tnB = value;
+    }
+
+    /**
+     * Gets the value of the pnB property.
+     *
+     * @return
+     *     possible object is
+     *     {@link PnBFieldParamsType }
+     *
+     */
+    public PnBFieldParamsType getPnB() {
+        return pnB;
+    }
+
+    /**
+     * Sets the value of the pnB property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link PnBFieldParamsType }
+     *
+     */
+    public void setPnB(PnBFieldParamsType value) {
+        this.pnB = value;
+    }
+
+    /**
+     * Gets the value of the gnB property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CharTwoFieldParamsType }
+     *
+     */
+    public CharTwoFieldParamsType getGnB() {
+        return gnB;
+    }
+
+    /**
+     * Sets the value of the gnB property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CharTwoFieldParamsType }
+     *
+     */
+    public void setGnB(CharTwoFieldParamsType value) {
+        this.gnB = value;
+    }
+
+    /**
+     * Gets the value of the any property.
+     *
+     * @return
+     *     possible object is
+     *     {@link Object }
+     *     {@link Element }
+     *
+     */
+    public Object getAny() {
+        return any;
+    }
+
+    /**
+     * Sets the value of the any property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link Object }
+     *     {@link Element }
+     *
+     */
+    public void setAny(Object value) {
+        this.any = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/KeyInfoReferenceType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/KeyInfoReferenceType.java
new file mode 100644
index 0000000..278b880
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/KeyInfoReferenceType.java
@@ -0,0 +1,118 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for KeyInfoReferenceType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="KeyInfoReferenceType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "KeyInfoReferenceType", namespace = "http://www.w3.org/2009/xmldsig11#")
+public class KeyInfoReferenceType {
+
+    @XmlAttribute(name = "URI", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/NamedCurveType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/NamedCurveType.java
new file mode 100644
index 0000000..5e6cd2f
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/NamedCurveType.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for NamedCurveType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="NamedCurveType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "NamedCurveType", namespace = "http://www.w3.org/2009/xmldsig11#")
+public class NamedCurveType {
+
+    @XmlAttribute(name = "URI", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/ObjectFactory.java
new file mode 100644
index 0000000..a89a5fd
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/ObjectFactory.java
@@ -0,0 +1,254 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.xmldsig11 package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _ECKeyValue_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "ECKeyValue");
+    private final static QName _Prime_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "Prime");
+    private final static QName _GnB_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "GnB");
+    private final static QName _TnB_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "TnB");
+    private final static QName _PnB_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "PnB");
+    private final static QName _OCSPResponse_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "OCSPResponse");
+    private final static QName _DEREncodedKeyValue_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "DEREncodedKeyValue");
+    private final static QName _KeyInfoReference_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "KeyInfoReference");
+    private final static QName _X509Digest_QNAME = new QName("http://www.w3.org/2009/xmldsig11#", "X509Digest");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.xmldsig11
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link ECKeyValueType }
+     *
+     */
+    public ECKeyValueType createECKeyValueType() {
+        return new ECKeyValueType();
+    }
+
+    /**
+     * Create an instance of {@link PrimeFieldParamsType }
+     *
+     */
+    public PrimeFieldParamsType createPrimeFieldParamsType() {
+        return new PrimeFieldParamsType();
+    }
+
+    /**
+     * Create an instance of {@link CharTwoFieldParamsType }
+     *
+     */
+    public CharTwoFieldParamsType createCharTwoFieldParamsType() {
+        return new CharTwoFieldParamsType();
+    }
+
+    /**
+     * Create an instance of {@link TnBFieldParamsType }
+     *
+     */
+    public TnBFieldParamsType createTnBFieldParamsType() {
+        return new TnBFieldParamsType();
+    }
+
+    /**
+     * Create an instance of {@link PnBFieldParamsType }
+     *
+     */
+    public PnBFieldParamsType createPnBFieldParamsType() {
+        return new PnBFieldParamsType();
+    }
+
+    /**
+     * Create an instance of {@link DEREncodedKeyValueType }
+     *
+     */
+    public DEREncodedKeyValueType createDEREncodedKeyValueType() {
+        return new DEREncodedKeyValueType();
+    }
+
+    /**
+     * Create an instance of {@link KeyInfoReferenceType }
+     *
+     */
+    public KeyInfoReferenceType createKeyInfoReferenceType() {
+        return new KeyInfoReferenceType();
+    }
+
+    /**
+     * Create an instance of {@link X509DigestType }
+     *
+     */
+    public X509DigestType createX509DigestType() {
+        return new X509DigestType();
+    }
+
+    /**
+     * Create an instance of {@link NamedCurveType }
+     *
+     */
+    public NamedCurveType createNamedCurveType() {
+        return new NamedCurveType();
+    }
+
+    /**
+     * Create an instance of {@link ECParametersType }
+     *
+     */
+    public ECParametersType createECParametersType() {
+        return new ECParametersType();
+    }
+
+    /**
+     * Create an instance of {@link FieldIDType }
+     *
+     */
+    public FieldIDType createFieldIDType() {
+        return new FieldIDType();
+    }
+
+    /**
+     * Create an instance of {@link CurveType }
+     *
+     */
+    public CurveType createCurveType() {
+        return new CurveType();
+    }
+
+    /**
+     * Create an instance of {@link ECValidationDataType }
+     *
+     */
+    public ECValidationDataType createECValidationDataType() {
+        return new ECValidationDataType();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ECKeyValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "ECKeyValue")
+    public JAXBElement<ECKeyValueType> createECKeyValue(ECKeyValueType value) {
+        return new JAXBElement<ECKeyValueType>(_ECKeyValue_QNAME, ECKeyValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link PrimeFieldParamsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "Prime")
+    public JAXBElement<PrimeFieldParamsType> createPrime(PrimeFieldParamsType value) {
+        return new JAXBElement<PrimeFieldParamsType>(_Prime_QNAME, PrimeFieldParamsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link CharTwoFieldParamsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "GnB")
+    public JAXBElement<CharTwoFieldParamsType> createGnB(CharTwoFieldParamsType value) {
+        return new JAXBElement<CharTwoFieldParamsType>(_GnB_QNAME, CharTwoFieldParamsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link TnBFieldParamsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "TnB")
+    public JAXBElement<TnBFieldParamsType> createTnB(TnBFieldParamsType value) {
+        return new JAXBElement<TnBFieldParamsType>(_TnB_QNAME, TnBFieldParamsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link PnBFieldParamsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "PnB")
+    public JAXBElement<PnBFieldParamsType> createPnB(PnBFieldParamsType value) {
+        return new JAXBElement<PnBFieldParamsType>(_PnB_QNAME, PnBFieldParamsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "OCSPResponse")
+    public JAXBElement<byte[]> createOCSPResponse(byte[] value) {
+        return new JAXBElement<byte[]>(_OCSPResponse_QNAME, byte[].class, null, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link DEREncodedKeyValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "DEREncodedKeyValue")
+    public JAXBElement<DEREncodedKeyValueType> createDEREncodedKeyValue(DEREncodedKeyValueType value) {
+        return new JAXBElement<DEREncodedKeyValueType>(_DEREncodedKeyValue_QNAME, DEREncodedKeyValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoReferenceType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "KeyInfoReference")
+    public JAXBElement<KeyInfoReferenceType> createKeyInfoReference(KeyInfoReferenceType value) {
+        return new JAXBElement<KeyInfoReferenceType>(_KeyInfoReference_QNAME, KeyInfoReferenceType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link X509DigestType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmldsig11#", name = "X509Digest")
+    public JAXBElement<X509DigestType> createX509Digest(X509DigestType value) {
+        return new JAXBElement<X509DigestType>(_X509Digest_QNAME, X509DigestType.class, null, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/PnBFieldParamsType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/PnBFieldParamsType.java
new file mode 100644
index 0000000..06de062
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/PnBFieldParamsType.java
@@ -0,0 +1,150 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for PnBFieldParamsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="PnBFieldParamsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;extension base="{http://www.w3.org/2009/xmldsig11#}CharTwoFieldParamsType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="K1" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *         &lt;element name="K2" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *         &lt;element name="K3" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PnBFieldParamsType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "k1",
+    "k2",
+    "k3"
+})
+public class PnBFieldParamsType
+    extends CharTwoFieldParamsType
+{
+
+    @XmlElement(name = "K1", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger k1;
+    @XmlElement(name = "K2", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger k2;
+    @XmlElement(name = "K3", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger k3;
+
+    /**
+     * Gets the value of the k1 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getK1() {
+        return k1;
+    }
+
+    /**
+     * Sets the value of the k1 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setK1(BigInteger value) {
+        this.k1 = value;
+    }
+
+    /**
+     * Gets the value of the k2 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getK2() {
+        return k2;
+    }
+
+    /**
+     * Sets the value of the k2 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setK2(BigInteger value) {
+        this.k2 = value;
+    }
+
+    /**
+     * Gets the value of the k3 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getK3() {
+        return k3;
+    }
+
+    /**
+     * Sets the value of the k3 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setK3(BigInteger value) {
+        this.k3 = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/PrimeFieldParamsType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/PrimeFieldParamsType.java
new file mode 100644
index 0000000..8be5a40
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/PrimeFieldParamsType.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for PrimeFieldParamsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="PrimeFieldParamsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="P" type="{http://www.w3.org/2000/09/xmldsig#}CryptoBinary"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PrimeFieldParamsType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "p"
+})
+public class PrimeFieldParamsType {
+
+    @XmlElement(name = "P", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    protected byte[] p;
+
+    /**
+     * Gets the value of the p property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getP() {
+        return p;
+    }
+
+    /**
+     * Sets the value of the p property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setP(byte[] value) {
+        this.p = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/TnBFieldParamsType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/TnBFieldParamsType.java
new file mode 100644
index 0000000..5dcb666
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/TnBFieldParamsType.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for TnBFieldParamsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="TnBFieldParamsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;extension base="{http://www.w3.org/2009/xmldsig11#}CharTwoFieldParamsType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="K" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TnBFieldParamsType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "k"
+})
+public class TnBFieldParamsType
+    extends CharTwoFieldParamsType
+{
+
+    @XmlElement(name = "K", namespace = "http://www.w3.org/2009/xmldsig11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger k;
+
+    /**
+     * Gets the value of the k property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getK() {
+        return k;
+    }
+
+    /**
+     * Sets the value of the k property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setK(BigInteger value) {
+        this.k = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmldsig11/X509DigestType.java b/src/main/java/org/apache/xml/security/binding/xmldsig11/X509DigestType.java
new file mode 100644
index 0000000..6936763
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmldsig11/X509DigestType.java
@@ -0,0 +1,112 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmldsig11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for X509DigestType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="X509DigestType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;base64Binary"&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "X509DigestType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
+    "value"
+})
+public class X509DigestType {
+
+    @XmlValue
+    protected byte[] value;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the value property.
+     *
+     * @return
+     *     possible object is
+     *     byte[]
+     */
+    public byte[] getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     *
+     * @param value
+     *     allowed object is
+     *     byte[]
+     */
+    public void setValue(byte[] value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/AgreementMethodType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/AgreementMethodType.java
new file mode 100644
index 0000000..2cd2058
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/AgreementMethodType.java
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.xml.security.binding.xmldsig.KeyInfoType;
+
+
+/**
+ * <p>Java class for AgreementMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="AgreementMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="KA-Nonce" type="{http://www.w3.org/2001/XMLSchema}base64Binary" minOccurs="0"/&gt;
+ *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *         &lt;element name="OriginatorKeyInfo" type="{http://www.w3.org/2000/09/xmldsig#}KeyInfoType" minOccurs="0"/&gt;
+ *         &lt;element name="RecipientKeyInfo" type="{http://www.w3.org/2000/09/xmldsig#}KeyInfoType" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "AgreementMethodType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "content"
+})
+public class AgreementMethodType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "KA-Nonce", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class),
+        @XmlElementRef(name = "RecipientKeyInfo", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class),
+        @XmlElementRef(name = "OriginatorKeyInfo", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class)
+    })
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     * {@link String }
+     * {@link Object }
+     * {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}
+     * {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/CipherDataType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherDataType.java
new file mode 100644
index 0000000..94586da
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherDataType.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2018.04.30 at 04:55:04 PM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for CipherDataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CipherDataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}CipherValue"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}CipherReference"/&gt;
+ *       &lt;/choice&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CipherDataType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "cipherValue",
+    "cipherReference"
+})
+public class CipherDataType {
+
+    @XmlElement(name = "CipherValue", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected CipherValueType cipherValue;
+    @XmlElement(name = "CipherReference", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected CipherReferenceType cipherReference;
+
+    /**
+     * Gets the value of the cipherValue property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CipherValueType }
+     *
+     */
+    public CipherValueType getCipherValue() {
+        return cipherValue;
+    }
+
+    /**
+     * Sets the value of the cipherValue property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CipherValueType }
+     *
+     */
+    public void setCipherValue(CipherValueType value) {
+        this.cipherValue = value;
+    }
+
+    /**
+     * Gets the value of the cipherReference property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CipherReferenceType }
+     *
+     */
+    public CipherReferenceType getCipherReference() {
+        return cipherReference;
+    }
+
+    /**
+     * Sets the value of the cipherReference property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CipherReferenceType }
+     *
+     */
+    public void setCipherReference(CipherReferenceType value) {
+        this.cipherReference = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/CipherReferenceType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherReferenceType.java
new file mode 100644
index 0000000..7dfbcb1
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherReferenceType.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for CipherReferenceType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CipherReferenceType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice&gt;
+ *         &lt;element name="Transforms" type="{http://www.w3.org/2001/04/xmlenc#}TransformsType" minOccurs="0"/&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CipherReferenceType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "transforms"
+})
+public class CipherReferenceType {
+
+    @XmlElement(name = "Transforms", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected TransformsType transforms;
+    @XmlAttribute(name = "URI", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+
+    /**
+     * Gets the value of the transforms property.
+     *
+     * @return
+     *     possible object is
+     *     {@link TransformsType }
+     *
+     */
+    public TransformsType getTransforms() {
+        return transforms;
+    }
+
+    /**
+     * Sets the value of the transforms property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link TransformsType }
+     *
+     */
+    public void setTransforms(TransformsType value) {
+        this.transforms = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/CipherValueType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherValueType.java
new file mode 100644
index 0000000..ff714ba
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/CipherValueType.java
@@ -0,0 +1,100 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2018.04.30 at 05:36:51 PM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.xml.security.binding.xop.Include;
+
+
+/**
+ * <p>Java class for CipherValueType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="CipherValueType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2004/08/xop/include}Include" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CipherValueType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "content"
+})
+public class CipherValueType {
+
+    @XmlElementRef(name = "Include", namespace = "http://www.w3.org/2004/08/xop/include", type = JAXBElement.class)
+    @XmlMixed
+    protected List<Serializable> content;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link JAXBElement }{@code <}{@link Include }{@code >}
+     *
+     *
+     */
+    public List<Serializable> getContent() {
+        if (content == null) {
+            content = new ArrayList<Serializable>();
+        }
+        return this.content;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedDataType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedDataType.java
new file mode 100644
index 0000000..17211eb
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedDataType.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for EncryptedDataType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptedDataType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;extension base="{http://www.w3.org/2001/04/xmlenc#}EncryptedType"&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptedDataType", namespace = "http://www.w3.org/2001/04/xmlenc#")
+public class EncryptedDataType
+    extends EncryptedType
+{
+
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedKeyType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedKeyType.java
new file mode 100644
index 0000000..4914aaa
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedKeyType.java
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for EncryptedKeyType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptedKeyType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;extension base="{http://www.w3.org/2001/04/xmlenc#}EncryptedType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}ReferenceList" minOccurs="0"/&gt;
+ *         &lt;element name="CarriedKeyName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Recipient" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptedKeyType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "referenceList",
+    "carriedKeyName"
+})
+public class EncryptedKeyType
+    extends EncryptedType
+{
+
+    @XmlElement(name = "ReferenceList", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected ReferenceList referenceList;
+    @XmlElement(name = "CarriedKeyName", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected String carriedKeyName;
+    @XmlAttribute(name = "Recipient")
+    protected String recipient;
+
+    /**
+     * Gets the value of the referenceList property.
+     *
+     * @return
+     *     possible object is
+     *     {@link ReferenceList }
+     *
+     */
+    public ReferenceList getReferenceList() {
+        return referenceList;
+    }
+
+    /**
+     * Sets the value of the referenceList property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link ReferenceList }
+     *
+     */
+    public void setReferenceList(ReferenceList value) {
+        this.referenceList = value;
+    }
+
+    /**
+     * Gets the value of the carriedKeyName property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getCarriedKeyName() {
+        return carriedKeyName;
+    }
+
+    /**
+     * Sets the value of the carriedKeyName property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setCarriedKeyName(String value) {
+        this.carriedKeyName = value;
+    }
+
+    /**
+     * Gets the value of the recipient property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getRecipient() {
+        return recipient;
+    }
+
+    /**
+     * Sets the value of the recipient property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setRecipient(String value) {
+        this.recipient = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedType.java
new file mode 100644
index 0000000..dc79073
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptedType.java
@@ -0,0 +1,295 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.xml.security.binding.xmldsig.KeyInfoType;
+
+
+/**
+ * <p>Java class for EncryptedType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptedType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="EncryptionMethod" type="{http://www.w3.org/2001/04/xmlenc#}EncryptionMethodType" minOccurs="0"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}KeyInfo" minOccurs="0"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}CipherData"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}EncryptionProperties" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *       &lt;attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="MimeType" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="Encoding" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptedType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "encryptionMethod",
+    "keyInfo",
+    "cipherData",
+    "encryptionProperties"
+})
+@XmlSeeAlso({
+    EncryptedDataType.class,
+    EncryptedKeyType.class
+})
+public abstract class EncryptedType {
+
+    @XmlElement(name = "EncryptionMethod", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected EncryptionMethodType encryptionMethod;
+    @XmlElement(name = "KeyInfo", namespace = "http://www.w3.org/2000/09/xmldsig#")
+    protected KeyInfoType keyInfo;
+    @XmlElement(name = "CipherData", namespace = "http://www.w3.org/2001/04/xmlenc#", required = true)
+    protected CipherDataType cipherData;
+    @XmlElement(name = "EncryptionProperties", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected EncryptionPropertiesType encryptionProperties;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+    @XmlAttribute(name = "Type")
+    @XmlSchemaType(name = "anyURI")
+    protected String type;
+    @XmlAttribute(name = "MimeType")
+    protected String mimeType;
+    @XmlAttribute(name = "Encoding")
+    @XmlSchemaType(name = "anyURI")
+    protected String encoding;
+
+    /**
+     * Gets the value of the encryptionMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link EncryptionMethodType }
+     *
+     */
+    public EncryptionMethodType getEncryptionMethod() {
+        return encryptionMethod;
+    }
+
+    /**
+     * Sets the value of the encryptionMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link EncryptionMethodType }
+     *
+     */
+    public void setEncryptionMethod(EncryptionMethodType value) {
+        this.encryptionMethod = value;
+    }
+
+    /**
+     * Gets the value of the keyInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link KeyInfoType }
+     *
+     */
+    public KeyInfoType getKeyInfo() {
+        return keyInfo;
+    }
+
+    /**
+     * Sets the value of the keyInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link KeyInfoType }
+     *
+     */
+    public void setKeyInfo(KeyInfoType value) {
+        this.keyInfo = value;
+    }
+
+    /**
+     * Gets the value of the cipherData property.
+     *
+     * @return
+     *     possible object is
+     *     {@link CipherDataType }
+     *
+     */
+    public CipherDataType getCipherData() {
+        return cipherData;
+    }
+
+    /**
+     * Sets the value of the cipherData property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link CipherDataType }
+     *
+     */
+    public void setCipherData(CipherDataType value) {
+        this.cipherData = value;
+    }
+
+    /**
+     * Gets the value of the encryptionProperties property.
+     *
+     * @return
+     *     possible object is
+     *     {@link EncryptionPropertiesType }
+     *
+     */
+    public EncryptionPropertiesType getEncryptionProperties() {
+        return encryptionProperties;
+    }
+
+    /**
+     * Sets the value of the encryptionProperties property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link EncryptionPropertiesType }
+     *
+     */
+    public void setEncryptionProperties(EncryptionPropertiesType value) {
+        this.encryptionProperties = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets the value of the type property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Sets the value of the type property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setType(String value) {
+        this.type = value;
+    }
+
+    /**
+     * Gets the value of the mimeType property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getMimeType() {
+        return mimeType;
+    }
+
+    /**
+     * Sets the value of the mimeType property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setMimeType(String value) {
+        this.mimeType = value;
+    }
+
+    /**
+     * Gets the value of the encoding property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getEncoding() {
+        return encoding;
+    }
+
+    /**
+     * Sets the value of the encoding property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setEncoding(String value) {
+        this.encoding = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionMethodType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionMethodType.java
new file mode 100644
index 0000000..a0629b3
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionMethodType.java
@@ -0,0 +1,139 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for EncryptionMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptionMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="KeySize" type="{http://www.w3.org/2001/04/xmlenc#}KeySizeType" minOccurs="0"/&gt;
+ *         &lt;element name="OAEPparams" type="{http://www.w3.org/2001/XMLSchema}base64Binary" minOccurs="0"/&gt;
+ *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptionMethodType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "content"
+})
+public class EncryptionMethodType {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "KeySize", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class),
+        @XmlElementRef(name = "OAEPparams", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class)
+    })
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link JAXBElement }{@code <}{@link BigInteger }{@code >}
+     * {@link Object }
+     * {@link JAXBElement }{@code <}{@link byte[]}{@code >}
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertiesType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertiesType.java
new file mode 100644
index 0000000..e83f13f
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertiesType.java
@@ -0,0 +1,129 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+
+/**
+ * <p>Java class for EncryptionPropertiesType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptionPropertiesType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}EncryptionProperty" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptionPropertiesType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "encryptionProperty"
+})
+public class EncryptionPropertiesType {
+
+    @XmlElement(name = "EncryptionProperty", namespace = "http://www.w3.org/2001/04/xmlenc#", required = true)
+    protected List<EncryptionPropertyType> encryptionProperty;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+
+    /**
+     * Gets the value of the encryptionProperty property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the encryptionProperty property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getEncryptionProperty().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link EncryptionPropertyType }
+     *
+     *
+     */
+    public List<EncryptionPropertyType> getEncryptionProperty() {
+        if (encryptionProperty == null) {
+            encryptionProperty = new ArrayList<EncryptionPropertyType>();
+        }
+        return this.encryptionProperty;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertyType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertyType.java
new file mode 100644
index 0000000..fd9b02a
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/EncryptionPropertyType.java
@@ -0,0 +1,187 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlMixed;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import javax.xml.namespace.QName;
+import org.w3c.dom.Element;
+
+
+/**
+ * <p>Java class for EncryptionPropertyType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="EncryptionPropertyType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice maxOccurs="unbounded"&gt;
+ *         &lt;any processContents='lax' namespace='##other'/&gt;
+ *       &lt;/choice&gt;
+ *       &lt;attribute name="Target" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *       &lt;anyAttribute namespace='http://www.w3.org/XML/1998/namespace'/&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EncryptionPropertyType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "content"
+})
+public class EncryptionPropertyType {
+
+    @XmlMixed
+    @XmlAnyElement(lax = true)
+    protected List<Object> content;
+    @XmlAttribute(name = "Target")
+    @XmlSchemaType(name = "anyURI")
+    protected String target;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the content property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the content property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getContent().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * {@link Object }
+     * {@link Element }
+     *
+     *
+     */
+    public List<Object> getContent() {
+        if (content == null) {
+            content = new ArrayList<Object>();
+        }
+        return this.content;
+    }
+
+    /**
+     * Gets the value of the target property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getTarget() {
+        return target;
+    }
+
+    /**
+     * Sets the value of the target property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setTarget(String value) {
+        this.target = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     *
+     * <p>
+     * the map is keyed by the name of the attribute and
+     * the value is the string value of the attribute.
+     *
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     *
+     *
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/xmlenc/ObjectFactory.java
new file mode 100644
index 0000000..44f35fb
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/ObjectFactory.java
@@ -0,0 +1,308 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2018.04.30 at 05:36:51 PM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.math.BigInteger;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+import org.apache.xml.security.binding.xmldsig.KeyInfoType;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.xmlenc package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _CipherData_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "CipherData");
+    private final static QName _CipherValue_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "CipherValue");
+    private final static QName _CipherReference_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "CipherReference");
+    private final static QName _EncryptedData_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "EncryptedData");
+    private final static QName _EncryptedKey_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "EncryptedKey");
+    private final static QName _AgreementMethod_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "AgreementMethod");
+    private final static QName _EncryptionProperties_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "EncryptionProperties");
+    private final static QName _EncryptionProperty_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "EncryptionProperty");
+    private final static QName _ReferenceListDataReference_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "DataReference");
+    private final static QName _ReferenceListKeyReference_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "KeyReference");
+    private final static QName _EncryptionMethodTypeKeySize_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "KeySize");
+    private final static QName _EncryptionMethodTypeOAEPparams_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "OAEPparams");
+    private final static QName _AgreementMethodTypeKANonce_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "KA-Nonce");
+    private final static QName _AgreementMethodTypeOriginatorKeyInfo_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "OriginatorKeyInfo");
+    private final static QName _AgreementMethodTypeRecipientKeyInfo_QNAME = new QName("http://www.w3.org/2001/04/xmlenc#", "RecipientKeyInfo");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.xmlenc
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link CipherDataType }
+     *
+     */
+    public CipherDataType createCipherDataType() {
+        return new CipherDataType();
+    }
+
+    /**
+     * Create an instance of {@link CipherValueType }
+     *
+     */
+    public CipherValueType createCipherValueType() {
+        return new CipherValueType();
+    }
+
+    /**
+     * Create an instance of {@link CipherReferenceType }
+     *
+     */
+    public CipherReferenceType createCipherReferenceType() {
+        return new CipherReferenceType();
+    }
+
+    /**
+     * Create an instance of {@link EncryptedDataType }
+     *
+     */
+    public EncryptedDataType createEncryptedDataType() {
+        return new EncryptedDataType();
+    }
+
+    /**
+     * Create an instance of {@link EncryptedKeyType }
+     *
+     */
+    public EncryptedKeyType createEncryptedKeyType() {
+        return new EncryptedKeyType();
+    }
+
+    /**
+     * Create an instance of {@link AgreementMethodType }
+     *
+     */
+    public AgreementMethodType createAgreementMethodType() {
+        return new AgreementMethodType();
+    }
+
+    /**
+     * Create an instance of {@link ReferenceList }
+     *
+     */
+    public ReferenceList createReferenceList() {
+        return new ReferenceList();
+    }
+
+    /**
+     * Create an instance of {@link ReferenceType }
+     *
+     */
+    public ReferenceType createReferenceType() {
+        return new ReferenceType();
+    }
+
+    /**
+     * Create an instance of {@link EncryptionPropertiesType }
+     *
+     */
+    public EncryptionPropertiesType createEncryptionPropertiesType() {
+        return new EncryptionPropertiesType();
+    }
+
+    /**
+     * Create an instance of {@link EncryptionPropertyType }
+     *
+     */
+    public EncryptionPropertyType createEncryptionPropertyType() {
+        return new EncryptionPropertyType();
+    }
+
+    /**
+     * Create an instance of {@link EncryptionMethodType }
+     *
+     */
+    public EncryptionMethodType createEncryptionMethodType() {
+        return new EncryptionMethodType();
+    }
+
+    /**
+     * Create an instance of {@link TransformsType }
+     *
+     */
+    public TransformsType createTransformsType() {
+        return new TransformsType();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link CipherDataType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "CipherData")
+    public JAXBElement<CipherDataType> createCipherData(CipherDataType value) {
+        return new JAXBElement<CipherDataType>(_CipherData_QNAME, CipherDataType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link CipherValueType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "CipherValue")
+    public JAXBElement<CipherValueType> createCipherValue(CipherValueType value) {
+        return new JAXBElement<CipherValueType>(_CipherValue_QNAME, CipherValueType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link CipherReferenceType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "CipherReference")
+    public JAXBElement<CipherReferenceType> createCipherReference(CipherReferenceType value) {
+        return new JAXBElement<CipherReferenceType>(_CipherReference_QNAME, CipherReferenceType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link EncryptedDataType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "EncryptedData")
+    public JAXBElement<EncryptedDataType> createEncryptedData(EncryptedDataType value) {
+        return new JAXBElement<EncryptedDataType>(_EncryptedData_QNAME, EncryptedDataType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link EncryptedKeyType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "EncryptedKey")
+    public JAXBElement<EncryptedKeyType> createEncryptedKey(EncryptedKeyType value) {
+        return new JAXBElement<EncryptedKeyType>(_EncryptedKey_QNAME, EncryptedKeyType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link AgreementMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "AgreementMethod")
+    public JAXBElement<AgreementMethodType> createAgreementMethod(AgreementMethodType value) {
+        return new JAXBElement<AgreementMethodType>(_AgreementMethod_QNAME, AgreementMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link EncryptionPropertiesType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "EncryptionProperties")
+    public JAXBElement<EncryptionPropertiesType> createEncryptionProperties(EncryptionPropertiesType value) {
+        return new JAXBElement<EncryptionPropertiesType>(_EncryptionProperties_QNAME, EncryptionPropertiesType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link EncryptionPropertyType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "EncryptionProperty")
+    public JAXBElement<EncryptionPropertyType> createEncryptionProperty(EncryptionPropertyType value) {
+        return new JAXBElement<EncryptionPropertyType>(_EncryptionProperty_QNAME, EncryptionPropertyType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "DataReference", scope = ReferenceList.class)
+    public JAXBElement<ReferenceType> createReferenceListDataReference(ReferenceType value) {
+        return new JAXBElement<ReferenceType>(_ReferenceListDataReference_QNAME, ReferenceType.class, ReferenceList.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "KeyReference", scope = ReferenceList.class)
+    public JAXBElement<ReferenceType> createReferenceListKeyReference(ReferenceType value) {
+        return new JAXBElement<ReferenceType>(_ReferenceListKeyReference_QNAME, ReferenceType.class, ReferenceList.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link BigInteger }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "KeySize", scope = EncryptionMethodType.class)
+    public JAXBElement<BigInteger> createEncryptionMethodTypeKeySize(BigInteger value) {
+        return new JAXBElement<BigInteger>(_EncryptionMethodTypeKeySize_QNAME, BigInteger.class, EncryptionMethodType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "OAEPparams", scope = EncryptionMethodType.class)
+    public JAXBElement<byte[]> createEncryptionMethodTypeOAEPparams(byte[] value) {
+        return new JAXBElement<byte[]>(_EncryptionMethodTypeOAEPparams_QNAME, byte[].class, EncryptionMethodType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link byte[]}{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "KA-Nonce", scope = AgreementMethodType.class)
+    public JAXBElement<byte[]> createAgreementMethodTypeKANonce(byte[] value) {
+        return new JAXBElement<byte[]>(_AgreementMethodTypeKANonce_QNAME, byte[].class, AgreementMethodType.class, ((byte[]) value));
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "OriginatorKeyInfo", scope = AgreementMethodType.class)
+    public JAXBElement<KeyInfoType> createAgreementMethodTypeOriginatorKeyInfo(KeyInfoType value) {
+        return new JAXBElement<KeyInfoType>(_AgreementMethodTypeOriginatorKeyInfo_QNAME, KeyInfoType.class, AgreementMethodType.class, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyInfoType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2001/04/xmlenc#", name = "RecipientKeyInfo", scope = AgreementMethodType.class)
+    public JAXBElement<KeyInfoType> createAgreementMethodTypeRecipientKeyInfo(KeyInfoType value) {
+        return new JAXBElement<KeyInfoType>(_AgreementMethodTypeRecipientKeyInfo_QNAME, KeyInfoType.class, AgreementMethodType.class, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceList.java b/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceList.java
new file mode 100644
index 0000000..e7e54ce
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceList.java
@@ -0,0 +1,103 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElementRefs;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for anonymous complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;choice maxOccurs="unbounded"&gt;
+ *         &lt;element name="DataReference" type="{http://www.w3.org/2001/04/xmlenc#}ReferenceType"/&gt;
+ *         &lt;element name="KeyReference" type="{http://www.w3.org/2001/04/xmlenc#}ReferenceType"/&gt;
+ *       &lt;/choice&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+    "dataReferenceOrKeyReference"
+})
+@XmlRootElement(name = "ReferenceList", namespace = "http://www.w3.org/2001/04/xmlenc#")
+public class ReferenceList {
+
+    @XmlElementRefs({
+        @XmlElementRef(name = "DataReference", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class),
+        @XmlElementRef(name = "KeyReference", namespace = "http://www.w3.org/2001/04/xmlenc#", type = JAXBElement.class)
+    })
+    protected List<JAXBElement<ReferenceType>> dataReferenceOrKeyReference;
+
+    /**
+     * Gets the value of the dataReferenceOrKeyReference property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the dataReferenceOrKeyReference property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getDataReferenceOrKeyReference().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}
+     * {@link JAXBElement }{@code <}{@link ReferenceType }{@code >}
+     *
+     *
+     */
+    public List<JAXBElement<ReferenceType>> getDataReferenceOrKeyReference() {
+        if (dataReferenceOrKeyReference == null) {
+            dataReferenceOrKeyReference = new ArrayList<JAXBElement<ReferenceType>>();
+        }
+        return this.dataReferenceOrKeyReference;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceType.java
new file mode 100644
index 0000000..774d0cc
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/ReferenceType.java
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ReferenceType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ReferenceType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ReferenceType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "any"
+})
+public class ReferenceType {
+
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "URI", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+
+    /**
+     * Gets the value of the any property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Object }
+     *
+     *
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc/TransformsType.java b/src/main/java/org/apache/xml/security/binding/xmlenc/TransformsType.java
new file mode 100644
index 0000000..77e85c9
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc/TransformsType.java
@@ -0,0 +1,95 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+import org.apache.xml.security.binding.xmldsig.TransformType;
+
+
+/**
+ * <p>Java class for TransformsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="TransformsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}Transform" maxOccurs="unbounded"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TransformsType", namespace = "http://www.w3.org/2001/04/xmlenc#", propOrder = {
+    "transform"
+})
+public class TransformsType {
+
+    @XmlElement(name = "Transform", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected List<TransformType> transform;
+
+    /**
+     * Gets the value of the transform property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the transform property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getTransform().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link TransformType }
+     *
+     *
+     */
+    public List<TransformType> getTransform() {
+        if (transform == null) {
+            transform = new ArrayList<TransformType>();
+        }
+        return this.transform;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/AlgorithmIdentifierType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/AlgorithmIdentifierType.java
new file mode 100644
index 0000000..a6b5f8c
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/AlgorithmIdentifierType.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for AlgorithmIdentifierType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="AlgorithmIdentifierType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Parameters" type="{http://www.w3.org/2001/XMLSchema}anyType" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "AlgorithmIdentifierType", namespace = "http://www.w3.org/2009/xmlenc11#", propOrder = {
+    "parameters"
+})
+@XmlSeeAlso({
+    MGFType.class,
+    PRFAlgorithmIdentifierType.class
+})
+public class AlgorithmIdentifierType {
+
+    @XmlElement(name = "Parameters", namespace = "http://www.w3.org/2009/xmlenc11#")
+    protected Object parameters;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the parameters property.
+     *
+     * @return
+     *     possible object is
+     *     {@link Object }
+     *
+     */
+    public Object getParameters() {
+        return parameters;
+    }
+
+    /**
+     * Sets the value of the parameters property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link Object }
+     *
+     */
+    public void setParameters(Object value) {
+        this.parameters = value;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/ConcatKDFParamsType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/ConcatKDFParamsType.java
new file mode 100644
index 0000000..b9dcaf4
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/ConcatKDFParamsType.java
@@ -0,0 +1,237 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.xml.security.binding.xmldsig.DigestMethodType;
+
+
+/**
+ * <p>Java class for ConcatKDFParamsType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="ConcatKDFParamsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2000/09/xmldsig#}DigestMethod"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="AlgorithmID" type="{http://www.w3.org/2001/XMLSchema}hexBinary" /&gt;
+ *       &lt;attribute name="PartyUInfo" type="{http://www.w3.org/2001/XMLSchema}hexBinary" /&gt;
+ *       &lt;attribute name="PartyVInfo" type="{http://www.w3.org/2001/XMLSchema}hexBinary" /&gt;
+ *       &lt;attribute name="SuppPubInfo" type="{http://www.w3.org/2001/XMLSchema}hexBinary" /&gt;
+ *       &lt;attribute name="SuppPrivInfo" type="{http://www.w3.org/2001/XMLSchema}hexBinary" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ConcatKDFParamsType", namespace = "http://www.w3.org/2009/xmlenc11#", propOrder = {
+    "digestMethod"
+})
+public class ConcatKDFParamsType {
+
+    @XmlElement(name = "DigestMethod", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true)
+    protected DigestMethodType digestMethod;
+    @XmlAttribute(name = "AlgorithmID")
+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
+    @XmlSchemaType(name = "hexBinary")
+    protected byte[] algorithmID;
+    @XmlAttribute(name = "PartyUInfo")
+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
+    @XmlSchemaType(name = "hexBinary")
+    protected byte[] partyUInfo;
+    @XmlAttribute(name = "PartyVInfo")
+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
+    @XmlSchemaType(name = "hexBinary")
+    protected byte[] partyVInfo;
+    @XmlAttribute(name = "SuppPubInfo")
+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
+    @XmlSchemaType(name = "hexBinary")
+    protected byte[] suppPubInfo;
+    @XmlAttribute(name = "SuppPrivInfo")
+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
+    @XmlSchemaType(name = "hexBinary")
+    protected byte[] suppPrivInfo;
+
+    /**
+     * Gets the value of the digestMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link DigestMethodType }
+     *
+     */
+    public DigestMethodType getDigestMethod() {
+        return digestMethod;
+    }
+
+    /**
+     * Sets the value of the digestMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link DigestMethodType }
+     *
+     */
+    public void setDigestMethod(DigestMethodType value) {
+        this.digestMethod = value;
+    }
+
+    /**
+     * Gets the value of the algorithmID property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public byte[] getAlgorithmID() {
+        return algorithmID;
+    }
+
+    /**
+     * Sets the value of the algorithmID property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithmID(byte[] value) {
+        this.algorithmID = value;
+    }
+
+    /**
+     * Gets the value of the partyUInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public byte[] getPartyUInfo() {
+        return partyUInfo;
+    }
+
+    /**
+     * Sets the value of the partyUInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setPartyUInfo(byte[] value) {
+        this.partyUInfo = value;
+    }
+
+    /**
+     * Gets the value of the partyVInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public byte[] getPartyVInfo() {
+        return partyVInfo;
+    }
+
+    /**
+     * Sets the value of the partyVInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setPartyVInfo(byte[] value) {
+        this.partyVInfo = value;
+    }
+
+    /**
+     * Gets the value of the suppPubInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public byte[] getSuppPubInfo() {
+        return suppPubInfo;
+    }
+
+    /**
+     * Sets the value of the suppPubInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setSuppPubInfo(byte[] value) {
+        this.suppPubInfo = value;
+    }
+
+    /**
+     * Gets the value of the suppPrivInfo property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public byte[] getSuppPrivInfo() {
+        return suppPrivInfo;
+    }
+
+    /**
+     * Sets the value of the suppPrivInfo property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setSuppPrivInfo(byte[] value) {
+        this.suppPrivInfo = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/DerivedKeyType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/DerivedKeyType.java
new file mode 100644
index 0000000..5c746be
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/DerivedKeyType.java
@@ -0,0 +1,262 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.xml.security.binding.xmlenc.ReferenceList;
+
+
+/**
+ * <p>Java class for DerivedKeyType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="DerivedKeyType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element ref="{http://www.w3.org/2009/xmlenc11#}KeyDerivationMethod" minOccurs="0"/&gt;
+ *         &lt;element ref="{http://www.w3.org/2001/04/xmlenc#}ReferenceList" minOccurs="0"/&gt;
+ *         &lt;element name="DerivedKeyName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="MasterKeyName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Recipient" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="Id" type="{http://www.w3.org/2001/XMLSchema}ID" /&gt;
+ *       &lt;attribute name="Type" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DerivedKeyType", namespace = "http://www.w3.org/2009/xmlenc11#", propOrder = {
+    "keyDerivationMethod",
+    "referenceList",
+    "derivedKeyName",
+    "masterKeyName"
+})
+public class DerivedKeyType {
+
+    @XmlElement(name = "KeyDerivationMethod", namespace = "http://www.w3.org/2009/xmlenc11#")
+    protected KeyDerivationMethodType keyDerivationMethod;
+    @XmlElement(name = "ReferenceList", namespace = "http://www.w3.org/2001/04/xmlenc#")
+    protected ReferenceList referenceList;
+    @XmlElement(name = "DerivedKeyName", namespace = "http://www.w3.org/2009/xmlenc11#")
+    protected String derivedKeyName;
+    @XmlElement(name = "MasterKeyName", namespace = "http://www.w3.org/2009/xmlenc11#")
+    protected String masterKeyName;
+    @XmlAttribute(name = "Recipient")
+    protected String recipient;
+    @XmlAttribute(name = "Id")
+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+    @XmlID
+    @XmlSchemaType(name = "ID")
+    protected String id;
+    @XmlAttribute(name = "Type")
+    @XmlSchemaType(name = "anyURI")
+    protected String type;
+
+    /**
+     * Gets the value of the keyDerivationMethod property.
+     *
+     * @return
+     *     possible object is
+     *     {@link KeyDerivationMethodType }
+     *
+     */
+    public KeyDerivationMethodType getKeyDerivationMethod() {
+        return keyDerivationMethod;
+    }
+
+    /**
+     * Sets the value of the keyDerivationMethod property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link KeyDerivationMethodType }
+     *
+     */
+    public void setKeyDerivationMethod(KeyDerivationMethodType value) {
+        this.keyDerivationMethod = value;
+    }
+
+    /**
+     * Gets the value of the referenceList property.
+     *
+     * @return
+     *     possible object is
+     *     {@link ReferenceList }
+     *
+     */
+    public ReferenceList getReferenceList() {
+        return referenceList;
+    }
+
+    /**
+     * Sets the value of the referenceList property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link ReferenceList }
+     *
+     */
+    public void setReferenceList(ReferenceList value) {
+        this.referenceList = value;
+    }
+
+    /**
+     * Gets the value of the derivedKeyName property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getDerivedKeyName() {
+        return derivedKeyName;
+    }
+
+    /**
+     * Sets the value of the derivedKeyName property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setDerivedKeyName(String value) {
+        this.derivedKeyName = value;
+    }
+
+    /**
+     * Gets the value of the masterKeyName property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getMasterKeyName() {
+        return masterKeyName;
+    }
+
+    /**
+     * Sets the value of the masterKeyName property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setMasterKeyName(String value) {
+        this.masterKeyName = value;
+    }
+
+    /**
+     * Gets the value of the recipient property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getRecipient() {
+        return recipient;
+    }
+
+    /**
+     * Sets the value of the recipient property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setRecipient(String value) {
+        this.recipient = value;
+    }
+
+    /**
+     * Gets the value of the id property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Sets the value of the id property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    /**
+     * Gets the value of the type property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Sets the value of the type property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setType(String value) {
+        this.type = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/KeyDerivationMethodType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/KeyDerivationMethodType.java
new file mode 100644
index 0000000..9242fdb
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/KeyDerivationMethodType.java
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for KeyDerivationMethodType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="KeyDerivationMethodType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;any maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "KeyDerivationMethodType", namespace = "http://www.w3.org/2009/xmlenc11#", propOrder = {
+    "any"
+})
+public class KeyDerivationMethodType {
+
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "Algorithm", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String algorithm;
+
+    /**
+     * Gets the value of the any property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Object }
+     *
+     *
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the algorithm property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Sets the value of the algorithm property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setAlgorithm(String value) {
+        this.algorithm = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/MGFType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/MGFType.java
new file mode 100644
index 0000000..dec10a4
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/MGFType.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for MGFType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="MGFType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2009/xmlenc11#}AlgorithmIdentifierType"&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "MGFType", namespace = "http://www.w3.org/2009/xmlenc11#")
+public class MGFType
+    extends AlgorithmIdentifierType
+{
+
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/ObjectFactory.java
new file mode 100644
index 0000000..53b08fd
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/ObjectFactory.java
@@ -0,0 +1,174 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.xmlenc11 package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _ConcatKDFParams_QNAME = new QName("http://www.w3.org/2009/xmlenc11#", "ConcatKDFParams");
+    private final static QName _DerivedKey_QNAME = new QName("http://www.w3.org/2009/xmlenc11#", "DerivedKey");
+    private final static QName _KeyDerivationMethod_QNAME = new QName("http://www.w3.org/2009/xmlenc11#", "KeyDerivationMethod");
+    private final static QName _PBKDF2Params_QNAME = new QName("http://www.w3.org/2009/xmlenc11#", "PBKDF2-params");
+    private final static QName _MGF_QNAME = new QName("http://www.w3.org/2009/xmlenc11#", "MGF");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.xmlenc11
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link PBKDF2ParameterType }
+     *
+     */
+    public PBKDF2ParameterType createPBKDF2ParameterType() {
+        return new PBKDF2ParameterType();
+    }
+
+    /**
+     * Create an instance of {@link ConcatKDFParamsType }
+     *
+     */
+    public ConcatKDFParamsType createConcatKDFParamsType() {
+        return new ConcatKDFParamsType();
+    }
+
+    /**
+     * Create an instance of {@link DerivedKeyType }
+     *
+     */
+    public DerivedKeyType createDerivedKeyType() {
+        return new DerivedKeyType();
+    }
+
+    /**
+     * Create an instance of {@link KeyDerivationMethodType }
+     *
+     */
+    public KeyDerivationMethodType createKeyDerivationMethodType() {
+        return new KeyDerivationMethodType();
+    }
+
+    /**
+     * Create an instance of {@link MGFType }
+     *
+     */
+    public MGFType createMGFType() {
+        return new MGFType();
+    }
+
+    /**
+     * Create an instance of {@link AlgorithmIdentifierType }
+     *
+     */
+    public AlgorithmIdentifierType createAlgorithmIdentifierType() {
+        return new AlgorithmIdentifierType();
+    }
+
+    /**
+     * Create an instance of {@link PRFAlgorithmIdentifierType }
+     *
+     */
+    public PRFAlgorithmIdentifierType createPRFAlgorithmIdentifierType() {
+        return new PRFAlgorithmIdentifierType();
+    }
+
+    /**
+     * Create an instance of {@link PBKDF2ParameterType.Salt }
+     *
+     */
+    public PBKDF2ParameterType.Salt createPBKDF2ParameterTypeSalt() {
+        return new PBKDF2ParameterType.Salt();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ConcatKDFParamsType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmlenc11#", name = "ConcatKDFParams")
+    public JAXBElement<ConcatKDFParamsType> createConcatKDFParams(ConcatKDFParamsType value) {
+        return new JAXBElement<ConcatKDFParamsType>(_ConcatKDFParams_QNAME, ConcatKDFParamsType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link DerivedKeyType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmlenc11#", name = "DerivedKey")
+    public JAXBElement<DerivedKeyType> createDerivedKey(DerivedKeyType value) {
+        return new JAXBElement<DerivedKeyType>(_DerivedKey_QNAME, DerivedKeyType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link KeyDerivationMethodType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmlenc11#", name = "KeyDerivationMethod")
+    public JAXBElement<KeyDerivationMethodType> createKeyDerivationMethod(KeyDerivationMethodType value) {
+        return new JAXBElement<KeyDerivationMethodType>(_KeyDerivationMethod_QNAME, KeyDerivationMethodType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link PBKDF2ParameterType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmlenc11#", name = "PBKDF2-params")
+    public JAXBElement<PBKDF2ParameterType> createPBKDF2Params(PBKDF2ParameterType value) {
+        return new JAXBElement<PBKDF2ParameterType>(_PBKDF2Params_QNAME, PBKDF2ParameterType.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link MGFType }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2009/xmlenc11#", name = "MGF")
+    public JAXBElement<MGFType> createMGF(MGFType value) {
+        return new JAXBElement<MGFType>(_MGF_QNAME, MGFType.class, null, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/PBKDF2ParameterType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/PBKDF2ParameterType.java
new file mode 100644
index 0000000..ae3495b
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/PBKDF2ParameterType.java
@@ -0,0 +1,267 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import java.math.BigInteger;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for PBKDF2ParameterType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="PBKDF2ParameterType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Salt"&gt;
+ *           &lt;complexType&gt;
+ *             &lt;complexContent&gt;
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *                 &lt;choice&gt;
+ *                   &lt;element name="Specified" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+ *                   &lt;element name="OtherSource" type="{http://www.w3.org/2009/xmlenc11#}AlgorithmIdentifierType"/&gt;
+ *                 &lt;/choice&gt;
+ *               &lt;/restriction&gt;
+ *             &lt;/complexContent&gt;
+ *           &lt;/complexType&gt;
+ *         &lt;/element&gt;
+ *         &lt;element name="IterationCount" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *         &lt;element name="KeyLength" type="{http://www.w3.org/2001/XMLSchema}positiveInteger"/&gt;
+ *         &lt;element name="PRF" type="{http://www.w3.org/2009/xmlenc11#}PRFAlgorithmIdentifierType"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PBKDF2ParameterType", namespace = "http://www.w3.org/2009/xmlenc11#", propOrder = {
+    "salt",
+    "iterationCount",
+    "keyLength",
+    "prf"
+})
+public class PBKDF2ParameterType {
+
+    @XmlElement(name = "Salt", namespace = "http://www.w3.org/2009/xmlenc11#", required = true)
+    protected PBKDF2ParameterType.Salt salt;
+    @XmlElement(name = "IterationCount", namespace = "http://www.w3.org/2009/xmlenc11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger iterationCount;
+    @XmlElement(name = "KeyLength", namespace = "http://www.w3.org/2009/xmlenc11#", required = true)
+    @XmlSchemaType(name = "positiveInteger")
+    protected BigInteger keyLength;
+    @XmlElement(name = "PRF", namespace = "http://www.w3.org/2009/xmlenc11#", required = true)
+    protected PRFAlgorithmIdentifierType prf;
+
+    /**
+     * Gets the value of the salt property.
+     *
+     * @return
+     *     possible object is
+     *     {@link PBKDF2ParameterType.Salt }
+     *
+     */
+    public PBKDF2ParameterType.Salt getSalt() {
+        return salt;
+    }
+
+    /**
+     * Sets the value of the salt property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link PBKDF2ParameterType.Salt }
+     *
+     */
+    public void setSalt(PBKDF2ParameterType.Salt value) {
+        this.salt = value;
+    }
+
+    /**
+     * Gets the value of the iterationCount property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getIterationCount() {
+        return iterationCount;
+    }
+
+    /**
+     * Sets the value of the iterationCount property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setIterationCount(BigInteger value) {
+        this.iterationCount = value;
+    }
+
+    /**
+     * Gets the value of the keyLength property.
+     *
+     * @return
+     *     possible object is
+     *     {@link BigInteger }
+     *
+     */
+    public BigInteger getKeyLength() {
+        return keyLength;
+    }
+
+    /**
+     * Sets the value of the keyLength property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link BigInteger }
+     *
+     */
+    public void setKeyLength(BigInteger value) {
+        this.keyLength = value;
+    }
+
+    /**
+     * Gets the value of the prf property.
+     *
+     * @return
+     *     possible object is
+     *     {@link PRFAlgorithmIdentifierType }
+     *
+     */
+    public PRFAlgorithmIdentifierType getPRF() {
+        return prf;
+    }
+
+    /**
+     * Sets the value of the prf property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link PRFAlgorithmIdentifierType }
+     *
+     */
+    public void setPRF(PRFAlgorithmIdentifierType value) {
+        this.prf = value;
+    }
+
+
+    /**
+     * <p>Java class for anonymous complex type.
+     *
+     * <p>The following schema fragment specifies the expected content contained within this class.
+     *
+     * <pre>
+     * &lt;complexType&gt;
+     *   &lt;complexContent&gt;
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+     *       &lt;choice&gt;
+     *         &lt;element name="Specified" type="{http://www.w3.org/2001/XMLSchema}base64Binary"/&gt;
+     *         &lt;element name="OtherSource" type="{http://www.w3.org/2009/xmlenc11#}AlgorithmIdentifierType"/&gt;
+     *       &lt;/choice&gt;
+     *     &lt;/restriction&gt;
+     *   &lt;/complexContent&gt;
+     * &lt;/complexType&gt;
+     * </pre>
+     *
+     *
+     */
+    @XmlAccessorType(XmlAccessType.FIELD)
+    @XmlType(name = "", propOrder = {
+        "specified",
+        "otherSource"
+    })
+    public static class Salt {
+
+        @XmlElement(name = "Specified", namespace = "http://www.w3.org/2009/xmlenc11#")
+        protected byte[] specified;
+        @XmlElement(name = "OtherSource", namespace = "http://www.w3.org/2009/xmlenc11#")
+        protected AlgorithmIdentifierType otherSource;
+
+        /**
+         * Gets the value of the specified property.
+         *
+         * @return
+         *     possible object is
+         *     byte[]
+         */
+        public byte[] getSpecified() {
+            return specified;
+        }
+
+        /**
+         * Sets the value of the specified property.
+         *
+         * @param value
+         *     allowed object is
+         *     byte[]
+         */
+        public void setSpecified(byte[] value) {
+            this.specified = value;
+        }
+
+        /**
+         * Gets the value of the otherSource property.
+         *
+         * @return
+         *     possible object is
+         *     {@link AlgorithmIdentifierType }
+         *
+         */
+        public AlgorithmIdentifierType getOtherSource() {
+            return otherSource;
+        }
+
+        /**
+         * Sets the value of the otherSource property.
+         *
+         * @param value
+         *     allowed object is
+         *     {@link AlgorithmIdentifierType }
+         *
+         */
+        public void setOtherSource(AlgorithmIdentifierType value) {
+            this.otherSource = value;
+        }
+
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xmlenc11/PRFAlgorithmIdentifierType.java b/src/main/java/org/apache/xml/security/binding/xmlenc11/PRFAlgorithmIdentifierType.java
new file mode 100644
index 0000000..7cfa4f4
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xmlenc11/PRFAlgorithmIdentifierType.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.07.31 at 11:10:09 AM IST
+//
+
+
+package org.apache.xml.security.binding.xmlenc11;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for PRFAlgorithmIdentifierType complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="PRFAlgorithmIdentifierType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2009/xmlenc11#}AlgorithmIdentifierType"&gt;
+ *       &lt;attribute name="Algorithm" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PRFAlgorithmIdentifierType", namespace = "http://www.w3.org/2009/xmlenc11#")
+public class PRFAlgorithmIdentifierType
+    extends AlgorithmIdentifierType
+{
+
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xop/Include.java b/src/main/java/org/apache/xml/security/binding/xop/Include.java
new file mode 100644
index 0000000..40d9694
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xop/Include.java
@@ -0,0 +1,150 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2018.03.28 at 11:22:27 AM IST
+//
+
+
+package org.apache.xml.security.binding.xop;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+
+/**
+ * <p>Java class for Include complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="Include"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;any namespace='##other' maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="href" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;anyAttribute namespace='##other'/&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Include", namespace = "http://www.w3.org/2004/08/xop/include", propOrder = {
+    "any"
+})
+public class Include {
+
+    @XmlAnyElement(lax = true)
+    protected List<Object> any;
+    @XmlAttribute(name = "href", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String href;
+    @XmlAnyAttribute
+    private Map<QName, String> otherAttributes = new HashMap<QName, String>();
+
+    /**
+     * Gets the value of the any property.
+     *
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the any property.
+     *
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAny().add(newItem);
+     * </pre>
+     *
+     *
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link Object }
+     *
+     *
+     */
+    public List<Object> getAny() {
+        if (any == null) {
+            any = new ArrayList<Object>();
+        }
+        return this.any;
+    }
+
+    /**
+     * Gets the value of the href property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getHref() {
+        return href;
+    }
+
+    /**
+     * Sets the value of the href property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setHref(String value) {
+        this.href = value;
+    }
+
+    /**
+     * Gets a map that contains attributes that aren't bound to any typed property on this class.
+     *
+     * <p>
+     * the map is keyed by the name of the attribute and
+     * the value is the string value of the attribute.
+     *
+     * the map returned by this method is live, and you can add new attribute
+     * by updating the map directly. Because of this design, there's no setter.
+     *
+     *
+     * @return
+     *     always non-null
+     */
+    public Map<QName, String> getOtherAttributes() {
+        return otherAttributes;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/binding/xop/ObjectFactory.java b/src/main/java/org/apache/xml/security/binding/xop/ObjectFactory.java
new file mode 100644
index 0000000..60ed3cf
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/binding/xop/ObjectFactory.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.
+ */
+
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2018.03.28 at 11:22:27 AM IST
+//
+
+
+package org.apache.xml.security.binding.xop;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.xml.security.binding.xop package.
+ * <p>An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups.  Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _Include_QNAME = new QName("http://www.w3.org/2004/08/xop/include", "Include");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.binding.xop
+     *
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link Include }
+     *
+     */
+    public Include createInclude() {
+        return new Include();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link Include }{@code >}}
+     *
+     */
+    @XmlElementDecl(namespace = "http://www.w3.org/2004/08/xop/include", name = "Include")
+    public JAXBElement<Include> createInclude(Include value) {
+        return new JAXBElement<Include>(_Include_QNAME, Include.class, null, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/c14n/CanonicalizationException.java b/src/main/java/org/apache/xml/security/c14n/CanonicalizationException.java
index f81e56b..79ea4e8 100644
--- a/src/main/java/org/apache/xml/security/c14n/CanonicalizationException.java
+++ b/src/main/java/org/apache/xml/security/c14n/CanonicalizationException.java
@@ -58,7 +58,7 @@
      * @param msgID
      * @param exArgs
      */
-    public CanonicalizationException(String msgID, Object[] exArgs) {
+    public CanonicalizationException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -85,13 +85,13 @@
      * @param exArgs
      */
     public CanonicalizationException(
-        Exception originalException, String msgID, Object[] exArgs
+        Exception originalException, String msgID, Object exArgs[]
     ) {
         super(originalException, msgID, exArgs);
     }
 
     @Deprecated
-    public CanonicalizationException(String msgID, Object[] exArgs, Exception originalException) {
+    public CanonicalizationException(String msgID, Object exArgs[], Exception originalException) {
         this(originalException, msgID, exArgs);
     }
 }
diff --git a/src/main/java/org/apache/xml/security/c14n/Canonicalizer.java b/src/main/java/org/apache/xml/security/c14n/Canonicalizer.java
index a0397e0..80d29b6 100644
--- a/src/main/java/org/apache/xml/security/c14n/Canonicalizer.java
+++ b/src/main/java/org/apache/xml/security/c14n/Canonicalizer.java
@@ -26,6 +26,8 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.c14n.implementations.Canonicalizer11_OmitComments;
 import org.apache.xml.security.c14n.implementations.Canonicalizer11_WithComments;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315ExclOmitComments;
@@ -45,7 +47,7 @@
 /**
  *
  */
-public final class Canonicalizer {
+public class Canonicalizer {
 
     /** The output encoding of canonicalized data */
     public static final String ENCODING = StandardCharsets.UTF_8.name();
@@ -94,7 +96,7 @@
         "http://santuario.apache.org/c14n/physical";
 
     private static Map<String, Class<? extends CanonicalizerSpi>> canonicalizerHash =
-        new ConcurrentHashMap<>();
+        new ConcurrentHashMap<String, Class<? extends CanonicalizerSpi>>();
 
     private final CanonicalizerSpi canonicalizerSpi;
     private boolean secureValidation;
@@ -113,7 +115,7 @@
             canonicalizerSpi = implementingClass.newInstance();
             canonicalizerSpi.reset = true;
         } catch (Exception e) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidCanonicalizerException(
                 e, "signature.Canonicalizer.UnknownCanonicalizer", exArgs
             );
@@ -150,7 +152,7 @@
             canonicalizerHash.get(algorithmURI);
 
         if (registeredClass != null)  {
-            Object[] exArgs = { algorithmURI, registeredClass };
+            Object exArgs[] = { algorithmURI, registeredClass };
             throw new AlgorithmAlreadyRegisteredException("algorithm.alreadyRegistered", exArgs);
         }
 
@@ -176,7 +178,7 @@
         Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI);
 
         if (registeredClass != null)  {
-            Object[] exArgs = { algorithmURI, registeredClass };
+            Object exArgs[] = { algorithmURI, registeredClass };
             throw new AlgorithmAlreadyRegisteredException("algorithm.alreadyRegistered", exArgs);
         }
 
@@ -254,7 +256,17 @@
         try (InputStream bais = new ByteArrayInputStream(inputBytes)) {
             InputSource in = new InputSource(bais);
 
+            // needs to validate for ID attribute normalization
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(true, secureValidation);
+
             /*
+             * for some of the test vectors from the specification,
+             * there has to be a validating parser for ID attributes, default
+             * attribute values, NMTOKENS, etc.
+             * Unfortunately, the test vectors do use different DTDs or
+             * even no DTD. So Xerces 1.3.1 fires many warnings about using
+             * ErrorHandlers.
+             *
              * Text from the spec:
              *
              * The input octet stream MUST contain a well-formed XML document,
@@ -268,7 +280,13 @@
              * though the document type declaration is not retained in the
              * canonical form.
              */
-            document = XMLUtils.read(in, secureValidation);
+            db.setErrorHandler(new org.apache.xml.security.utils.IgnoreAllErrorHandler());
+
+            try {
+                document = db.parse(in);
+            } finally {
+                XMLUtils.repoolDocumentBuilder(db);
+            }
         }
         return this.canonicalizeSubtree(document);
     }
diff --git a/src/main/java/org/apache/xml/security/c14n/CanonicalizerSpi.java b/src/main/java/org/apache/xml/security/c14n/CanonicalizerSpi.java
index be193eb..9f7c218 100644
--- a/src/main/java/org/apache/xml/security/c14n/CanonicalizerSpi.java
+++ b/src/main/java/org/apache/xml/security/c14n/CanonicalizerSpi.java
@@ -22,6 +22,8 @@
 import java.io.OutputStream;
 import java.util.Set;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
@@ -57,7 +59,13 @@
         try (java.io.InputStream bais = new ByteArrayInputStream(inputBytes)) {
             InputSource in = new InputSource(bais);
 
-            document = XMLUtils.read(in, secureValidation);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false, secureValidation);
+
+            try {
+                document = db.parse(in);
+            } finally {
+                XMLUtils.repoolDocumentBuilder(db);
+            }
         }
         return this.engineCanonicalizeSubTree(document);
     }
diff --git a/src/main/java/org/apache/xml/security/c14n/InvalidCanonicalizerException.java b/src/main/java/org/apache/xml/security/c14n/InvalidCanonicalizerException.java
index 04870d0..d4490d9 100644
--- a/src/main/java/org/apache/xml/security/c14n/InvalidCanonicalizerException.java
+++ b/src/main/java/org/apache/xml/security/c14n/InvalidCanonicalizerException.java
@@ -50,7 +50,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidCanonicalizerException(String msgID, Object[] exArgs) {
+    public InvalidCanonicalizerException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -77,7 +77,7 @@
      * @param exArgs
      */
     public InvalidCanonicalizerException(
-        Exception originalException, String msgID, Object[] exArgs
+        Exception originalException, String msgID, Object exArgs[]
     ) {
         super(originalException, msgID, exArgs);
     }
diff --git a/src/main/java/org/apache/xml/security/c14n/helper/C14nHelper.java b/src/main/java/org/apache/xml/security/c14n/helper/C14nHelper.java
index 68c3a24..a3697bb 100644
--- a/src/main/java/org/apache/xml/security/c14n/helper/C14nHelper.java
+++ b/src/main/java/org/apache/xml/security/c14n/helper/C14nHelper.java
@@ -101,7 +101,7 @@
         if ((definesDefaultNS || definesNonDefaultNS) && namespaceIsRelative(attr)) {
             String parentName = attr.getOwnerElement().getTagName();
             String attrValue = attr.getValue();
-            Object[] exArgs = { parentName, nodeAttrName, attrValue };
+            Object exArgs[] = { parentName, nodeAttrName, attrValue };
 
             throw new CanonicalizationException(
                 "c14n.Canonicalizer.RelativeNamespace", exArgs
@@ -119,7 +119,7 @@
     public static void checkTraversability(Document document)
         throws CanonicalizationException {
         if (!document.isSupported("Traversal", "2.0")) {
-            Object[] exArgs = {document.getImplementation().getClass().getName() };
+            Object exArgs[] = {document.getImplementation().getClass().getName() };
 
             throw new CanonicalizationException(
                 "c14n.Canonicalizer.TraversalNotSupported", exArgs
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java b/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java
index 506b098..8330d45 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315.java
@@ -141,7 +141,7 @@
             return;
         }
         // result will contain the attrs which have to be output
-        SortedSet<Attr> result = new TreeSet<>(COMPARE);
+        SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
 
         if (element.hasAttributes()) {
             NamedNodeMap attrs = element.getAttributes();
@@ -164,7 +164,7 @@
                         //Render the ns definition
                         result.add((Attr)n);
                         if (C14nHelper.namespaceIsRelative(attribute)) {
-                            Object[] exArgs = { element.getTagName(), NName, attribute.getNodeValue() };
+                            Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
                             throw new CanonicalizationException(
                                 "c14n.Canonicalizer.RelativeNamespace", exArgs
                             );
@@ -209,7 +209,7 @@
         // result will contain the attrs which have to be output
         xmlattrStack.push(ns.getLevel());
         boolean isRealVisible = isVisibleDO(element, ns.getLevel()) == 1;
-        SortedSet<Attr> result = new TreeSet<>(COMPARE);
+        SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
 
         if (element.hasAttributes()) {
             NamedNodeMap attrs = element.getAttributes();
@@ -249,7 +249,7 @@
                             if (n != null) {
                                 result.add((Attr)n);
                                 if (C14nHelper.namespaceIsRelative(attribute)) {
-                                    Object[] exArgs = { element.getTagName(), NName, attribute.getNodeValue() };
+                                    Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
                                     throw new CanonicalizationException(
                                         "c14n.Canonicalizer.RelativeNamespace", exArgs
                                     );
@@ -335,7 +335,7 @@
             String NName = e.getPrefix();
             String NValue = e.getNamespaceURI();
             String Name;
-            if (NName == null || NName.isEmpty()) {
+            if (NName == null || NName.equals("")) {
                 NName = "xmlns";
                 Name = "xmlns";
             } else {
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java b/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java
index fda565e..32aaac3 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/Canonicalizer20010315Excl.java
@@ -161,11 +161,11 @@
                                            Map<String, byte[]> cache)
         throws CanonicalizationException, DOMException, IOException {
         // result will contain the attrs which have to be output
-        SortedSet<Attr> result = new TreeSet<>(COMPARE);
+        SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
 
         // The prefix visibly utilized (in the attribute or in the name) in
         // the element
-        SortedSet<String> visiblyUtilized = new TreeSet<>();
+        SortedSet<String> visiblyUtilized = new TreeSet<String>();
         if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
             visiblyUtilized.addAll(inclusiveNSSet);
         }
@@ -193,7 +193,7 @@
                     && C14nHelper.namespaceIsRelative(NNodeValue)) {
                     // The default mapping for xml must not be output.
                     // New definition check if it is relative.
-                    Object[] exArgs = {element.getTagName(), NName, attribute.getNodeValue()};
+                    Object exArgs[] = {element.getTagName(), NName, attribute.getNodeValue()};
                     throw new CanonicalizationException(
                         "c14n.Canonicalizer.RelativeNamespace", exArgs
                     );
@@ -238,7 +238,7 @@
                                     Map<String, byte[]> cache)
         throws CanonicalizationException, DOMException, IOException {
         // result will contain the attrs which have to be output
-        SortedSet<Attr> result = new TreeSet<>(COMPARE);
+        SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
 
         // The prefix visibly utilized (in the attribute or in the name) in
         // the element
@@ -246,7 +246,7 @@
         // It's the output selected.
         boolean isOutputElement = isVisibleDO(element, ns.getLevel()) == 1;
         if (isOutputElement) {
-            visiblyUtilized = new TreeSet<>();
+            visiblyUtilized = new TreeSet<String>();
             if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
                 visiblyUtilized.addAll(inclusiveNSSet);
             }
@@ -282,7 +282,7 @@
                         if (n != null) {
                             result.add((Attr)n);
                             if (C14nHelper.namespaceIsRelative(attribute)) {
-                                Object[] exArgs = { element.getTagName(), NName, attribute.getNodeValue() };
+                                Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
                                 throw new CanonicalizationException(
                                     "c14n.Canonicalizer.RelativeNamespace", exArgs
                                 );
@@ -293,7 +293,7 @@
                     if (ns.addMapping(NName, NNodeValue, attribute)
                         && C14nHelper.namespaceIsRelative(NNodeValue)) {
                         // New definition check if it is relative
-                        Object[] exArgs = { element.getTagName(), NName, attribute.getNodeValue() };
+                        Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
                         throw new CanonicalizationException(
                             "c14n.Canonicalizer.RelativeNamespace", exArgs
                         );
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java b/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java
index 11e0cac..8a329cf 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java
@@ -562,8 +562,10 @@
                 }
             }
         }
-
-        return this.xpathNodeSet == null || this.xpathNodeSet.contains(currentNode);
+        if (this.xpathNodeSet != null && !this.xpathNodeSet.contains(currentNode)) {
+            return false;
+        }
+        return true;
     }
 
     protected void handleParent(Element e, NameSpaceSymbTable ns) {
@@ -586,7 +588,7 @@
             String NName = e.getPrefix();
             String NValue = e.getNamespaceURI();
             String Name;
-            if (NName == null || NName.isEmpty()) {
+            if (NName == null || NName.equals("")) {
                 NName = XMLNS;
                 Name = XMLNS;
             } else {
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerPhysical.java b/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerPhysical.java
index 5d88943..64304aa 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerPhysical.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerPhysical.java
@@ -124,7 +124,7 @@
         throws CanonicalizationException, DOMException, IOException {
         if (element.hasAttributes()) {
             // result will contain all the attrs declared directly on that element
-            SortedSet<Attr> result = new TreeSet<>(COMPARE);
+            SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
 
             NamedNodeMap attrs = element.getAttributes();
             int attrsLength = attrs.getLength();
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java b/src/main/java/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java
index d87e6a9..4d98822 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/NameSpaceSymbTable.java
@@ -34,9 +34,6 @@
  */
 public class NameSpaceSymbTable {
 
-    private static final org.slf4j.Logger LOG =
-        org.slf4j.LoggerFactory.getLogger(NameSpaceSymbTable.class);
-
     private static final String XMLNS = "xmlns";
     private static final SymbMap initialMap = new SymbMap();
 
@@ -59,11 +56,7 @@
     public NameSpaceSymbTable() {
         level = new ArrayList<>();
         //Insert the default binding for xmlns.
-        try {
-            symb = initialMap.clone();
-        } catch (CloneNotSupportedException e) {
-            LOG.error("Error cloning the initial map");
-        }
+        symb = (SymbMap) initialMap.clone();
     }
 
     /**
@@ -77,7 +70,7 @@
             NameSpaceSymbEntry n = it.next();
             //put them rendered?
             if (!n.rendered && n.n != null) {
-                n = n.clone();
+                n = (NameSpaceSymbEntry) n.clone();
                 needsClone();
                 symb.put(n.prefix, n);
                 n.lastrendered = n.uri;
@@ -135,11 +128,7 @@
     final void needsClone() {
         if (!cloned) {
             level.set(level.size() - 1, symb);
-            try {
-                symb = symb.clone();
-            } catch (CloneNotSupportedException e) {
-                LOG.error("Error cloning the symbol map");
-            }
+            symb = (SymbMap) symb.clone();
             cloned = true;
         }
     }
@@ -162,7 +151,7 @@
             return null;
         }
         // Mark this entry as render.
-        entry = entry.clone();
+        entry = (NameSpaceSymbEntry) entry.clone();
         needsClone();
         symb.put(prefix, entry);
         entry.rendered = true;
@@ -230,7 +219,7 @@
 
         if (ob != null && uri.equals(ob.uri)) {
             if (!ob.rendered) {
-                ob = ob.clone();
+                ob = (NameSpaceSymbEntry) ob.clone();
                 needsClone();
                 symb.put(prefix, ob);
                 ob.lastrendered = uri;
@@ -311,9 +300,9 @@
     }
 
     /** {@inheritDoc} */
-    public NameSpaceSymbEntry clone() { //NOPMD
+    public Object clone() {
         try {
-            return (NameSpaceSymbEntry)super.clone();
+            return super.clone();
         } catch (CloneNotSupportedException e) {
             return null;
         }
@@ -377,7 +366,7 @@
      */
     protected void rehash(int newCapacity) {
         int oldCapacity = keys.length;
-        String[] oldKeys = keys;
+        String oldKeys[] = keys;
         NameSpaceSymbEntry oldVals[] = entries;
 
         keys = new String[newCapacity];
@@ -397,14 +386,18 @@
         return entries[index(key)];
     }
 
-    @Override
-    public SymbMap clone() throws CloneNotSupportedException  {
-        SymbMap copy = (SymbMap) super.clone();
-        copy.entries = new NameSpaceSymbEntry[entries.length];
-        System.arraycopy(entries, 0, copy.entries, 0, entries.length);
-        copy.keys = new String[keys.length];
-        System.arraycopy(keys, 0, copy.keys, 0, keys.length);
+    protected Object clone()  {
+        try {
+            SymbMap copy = (SymbMap) super.clone();
+            copy.entries = new NameSpaceSymbEntry[entries.length];
+            System.arraycopy(entries, 0, copy.entries, 0, entries.length);
+            copy.keys = new String[keys.length];
+            System.arraycopy(keys, 0, copy.keys, 0, keys.length);
 
-        return copy;
+            return copy;
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 }
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/UtfHelpper.java b/src/main/java/org/apache/xml/security/c14n/implementations/UtfHelpper.java
index 2ef5ffe..1220f00 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/UtfHelpper.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/UtfHelpper.java
@@ -114,6 +114,42 @@
         }
     }
 
+    @Deprecated
+    public static void writeCharToUtf8(final char c, final OutputStream out) throws IOException {
+        if (c < 0x80) {
+            out.write(c);
+            return;
+        }
+        if (c >= 0xD800 && c <= 0xDBFF || c >= 0xDC00 && c <= 0xDFFF) {
+            //No Surrogates in sun java
+            out.write(0x3f);
+            return;
+        }
+        int bias;
+        int write;
+        char ch;
+        if (c > 0x07FF) {
+            ch = (char)(c>>>12);
+            write = 0xE0;
+            if (ch > 0) {
+                write |= ch & 0x0F;
+            }
+            out.write(write);
+            write = 0x80;
+            bias = 0x3F;
+        } else {
+            write = 0xC0;
+            bias = 0x1F;
+        }
+        ch = (char)(c>>>6);
+        if (ch > 0) {
+            write |= ch & bias;
+        }
+        out.write(write);
+        out.write(0x80 | ((c) & 0x3F));
+
+    }
+
     public static void writeStringToUtf8(
         final String str, final OutputStream out
     ) throws IOException {
@@ -207,7 +243,7 @@
                 continue;
             }
             if (!expanded) {
-                byte[] newResult = new byte[6*length];
+                byte newResult[] = new byte[6*length];
                 System.arraycopy(result, 0, newResult, 0, out);
                 result = newResult;
                 expanded = true;
@@ -252,7 +288,7 @@
             }
         }
         if (expanded) {
-            byte[] newResult = new byte[out];
+            byte newResult[] = new byte[out];
             System.arraycopy(result, 0, newResult, 0, out);
             result = newResult;
         }
diff --git a/src/main/java/org/apache/xml/security/c14n/implementations/XmlAttrStack.java b/src/main/java/org/apache/xml/security/c14n/implementations/XmlAttrStack.java
index a0ae17d..8fa9179 100644
--- a/src/main/java/org/apache/xml/security/c14n/implementations/XmlAttrStack.java
+++ b/src/main/java/org/apache/xml/security/c14n/implementations/XmlAttrStack.java
@@ -116,7 +116,7 @@
                 Iterator<Attr> it = e.nodes.iterator();
                 while (it.hasNext() && successiveOmitted) {
                     Attr n = it.next();
-                    if ("base".equals(n.getLocalName()) && !e.rendered) {
+                    if (n.getLocalName().equals("base") && !e.rendered) {
                         baseAttrs.add(n);
                     } else if (!loa.containsKey(n.getName())) {
                         loa.put(n.getName(), n);
@@ -129,7 +129,7 @@
                 Attr baseAttr = null;
                 while (it.hasNext()) {
                     Attr n = it.next();
-                    if ("base".equals(n.getLocalName())) {
+                    if (n.getLocalName().equals("base")) {
                         base = n.getValue();
                         baseAttr = n;
                         break;
@@ -218,7 +218,7 @@
                         tquery = bquery;
                     }
                 } else {
-                    if (rpath.charAt(0) == '/') {
+                    if (rpath.startsWith("/")) {
                         tpath = removeDotSegments(rpath);
                     } else {
                         if (bauthority != null && bpath.length() == 0) {
@@ -259,7 +259,7 @@
         // If the input buffer starts with a root slash "/" then move this
         // character to the output buffer.
         if (input.charAt(0) == '/') {
-            output.append('/');
+            output.append("/");
             input = input.substring(1);
         }
 
@@ -278,7 +278,7 @@
                 printStep("2A", output.toString(), input);
             } else if (input.startsWith("../")) {
                 input = input.substring(3);
-                if (!"/".equals(output.toString())) {
+                if (!output.toString().equals("/")) {
                     output.append("../");
                 }
                 printStep("2A", output.toString(), input);
@@ -288,7 +288,7 @@
             } else if (input.startsWith("/./")) {
                 input = input.substring(2);
                 printStep("2B", output.toString(), input);
-            } else if ("/.".equals(input)) {
+            } else if (input.equals("/.")) {
                 // FIXME: what is complete path segment?
                 input = input.replaceFirst("/.", "/");
                 printStep("2B", output.toString(), input);
@@ -305,7 +305,7 @@
             } else if (input.startsWith("/../")) {
                 input = input.substring(3);
                 if (output.length() == 0) {
-                    output.append('/');
+                    output.append("/");
                 } else if (output.toString().endsWith("../")) {
                     output.append("..");
                 } else if (output.toString().endsWith("..")) {
@@ -322,11 +322,11 @@
                     }
                 }
                 printStep("2C", output.toString(), input);
-            } else if ("/..".equals(input)) {
+            } else if (input.equals("/..")) {
                 // FIXME: what is complete path segment?
                 input = input.replaceFirst("/..", "/");
                 if (output.length() == 0) {
-                    output.append('/');
+                    output.append("/");
                 } else if (output.toString().endsWith("../")) {
                     output.append("..");
                 } else if (output.toString().endsWith("..")) {
@@ -348,11 +348,11 @@
                 // only of ".." and if the output buffer does not contain only
                 // the root slash "/", then move the ".." to the output buffer
                 // else delte it.; otherwise,
-            } else if (".".equals(input)) {
+            } else if (input.equals(".")) {
                 input = "";
                 printStep("2D", output.toString(), input);
-            } else if ("..".equals(input)) {
-                if (!"/".equals(output.toString())) {
+            } else if (input.equals("..")) {
+                if (!output.toString().equals("/")) {
                     output.append("..");
                 }
                 input = "";
@@ -388,7 +388,7 @@
         // then append a slash "/". The output buffer is returned as the result
         // of remove_dot_segments
         if (output.toString().endsWith("..")) {
-            output.append('/');
+            output.append("/");
             printStep("3 ", output.toString(), input);
         }
 
diff --git a/src/main/java/org/apache/xml/security/configuration/AlgorithmType.java b/src/main/java/org/apache/xml/security/configuration/AlgorithmType.java
new file mode 100644
index 0000000..71a1fe1
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/AlgorithmType.java
@@ -0,0 +1,339 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for AlgorithmType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="AlgorithmType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" /&gt;
+ *       &lt;attribute name="Description" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="AlgorithmClass" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="RequirementLevel" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="SpecificationURL" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="JCEProvider" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="JCEName" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="KeyLength" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
+ *       &lt;attribute name="IVLength" type="{http://www.w3.org/2001/XMLSchema}int" /&gt;
+ *       &lt;attribute name="RequiredKey" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "AlgorithmType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "value"
+})
+public class AlgorithmType {
+
+    @XmlValue
+    protected String value;
+    @XmlAttribute(name = "URI", required = true)
+    @XmlSchemaType(name = "anyURI")
+    protected String uri;
+    @XmlAttribute(name = "Description", required = true)
+    protected String description;
+    @XmlAttribute(name = "AlgorithmClass", required = true)
+    protected String algorithmClass;
+    @XmlAttribute(name = "RequirementLevel", required = true)
+    protected String requirementLevel;
+    @XmlAttribute(name = "SpecificationURL")
+    protected String specificationURL;
+    @XmlAttribute(name = "JCEProvider")
+    protected String jceProvider;
+    @XmlAttribute(name = "JCEName", required = true)
+    protected String jceName;
+    @XmlAttribute(name = "KeyLength")
+    protected Integer keyLength;
+    @XmlAttribute(name = "IVLength")
+    protected Integer ivLength;
+    @XmlAttribute(name = "RequiredKey")
+    protected String requiredKey;
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Sets the value of the description property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setDescription(String value) {
+        this.description = value;
+    }
+
+    /**
+     * Gets the value of the algorithmClass property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getAlgorithmClass() {
+        return algorithmClass;
+    }
+
+    /**
+     * Sets the value of the algorithmClass property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setAlgorithmClass(String value) {
+        this.algorithmClass = value;
+    }
+
+    /**
+     * Gets the value of the requirementLevel property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getRequirementLevel() {
+        return requirementLevel;
+    }
+
+    /**
+     * Sets the value of the requirementLevel property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setRequirementLevel(String value) {
+        this.requirementLevel = value;
+    }
+
+    /**
+     * Gets the value of the specificationURL property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getSpecificationURL() {
+        return specificationURL;
+    }
+
+    /**
+     * Sets the value of the specificationURL property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setSpecificationURL(String value) {
+        this.specificationURL = value;
+    }
+
+    /**
+     * Gets the value of the jceProvider property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getJCEProvider() {
+        return jceProvider;
+    }
+
+    /**
+     * Sets the value of the jceProvider property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setJCEProvider(String value) {
+        this.jceProvider = value;
+    }
+
+    /**
+     * Gets the value of the jceName property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getJCEName() {
+        return jceName;
+    }
+
+    /**
+     * Sets the value of the jceName property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setJCEName(String value) {
+        this.jceName = value;
+    }
+
+    /**
+     * Gets the value of the keyLength property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Integer }
+     *     
+     */
+    public Integer getKeyLength() {
+        return keyLength;
+    }
+
+    /**
+     * Sets the value of the keyLength property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Integer }
+     *     
+     */
+    public void setKeyLength(Integer value) {
+        this.keyLength = value;
+    }
+
+    /**
+     * Gets the value of the ivLength property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link Integer }
+     *     
+     */
+    public Integer getIVLength() {
+        return ivLength;
+    }
+
+    /**
+     * Sets the value of the ivLength property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link Integer }
+     *     
+     */
+    public void setIVLength(Integer value) {
+        this.ivLength = value;
+    }
+
+    /**
+     * Gets the value of the requiredKey property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getRequiredKey() {
+        return requiredKey;
+    }
+
+    /**
+     * Sets the value of the requiredKey property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setRequiredKey(String value) {
+        this.requiredKey = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/ConfigurationType.java b/src/main/java/org/apache/xml/security/configuration/ConfigurationType.java
new file mode 100644
index 0000000..e0df0e4
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/ConfigurationType.java
@@ -0,0 +1,209 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ConfigurationType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="ConfigurationType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Properties" type="{http://www.xmlsecurity.org/NS/configuration}PropertiesType"/&gt;
+ *         &lt;element name="SecurityHeaderHandlers" type="{http://www.xmlsecurity.org/NS/configuration}SecurityHeaderHandlersType"/&gt;
+ *         &lt;element name="TransformAlgorithms" type="{http://www.xmlsecurity.org/NS/configuration}TransformAlgorithmsType"/&gt;
+ *         &lt;element name="JCEAlgorithmMappings" type="{http://www.xmlsecurity.org/NS/configuration}JCEAlgorithmMappingsType"/&gt;
+ *         &lt;element name="ResourceResolvers" type="{http://www.xmlsecurity.org/NS/configuration}ResourceResolversType"/&gt;
+ *       &lt;/sequence&gt;
+ *       &lt;attribute name="target" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ConfigurationType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "properties",
+    "securityHeaderHandlers",
+    "transformAlgorithms",
+    "jceAlgorithmMappings",
+    "resourceResolvers"
+})
+public class ConfigurationType {
+
+    @XmlElement(name = "Properties", namespace = "http://www.xmlsecurity.org/NS/configuration", required = true)
+    protected PropertiesType properties;
+    @XmlElement(name = "SecurityHeaderHandlers", namespace = "http://www.xmlsecurity.org/NS/configuration", required = true)
+    protected SecurityHeaderHandlersType securityHeaderHandlers;
+    @XmlElement(name = "TransformAlgorithms", namespace = "http://www.xmlsecurity.org/NS/configuration", required = true)
+    protected TransformAlgorithmsType transformAlgorithms;
+    @XmlElement(name = "JCEAlgorithmMappings", namespace = "http://www.xmlsecurity.org/NS/configuration", required = true)
+    protected JCEAlgorithmMappingsType jceAlgorithmMappings;
+    @XmlElement(name = "ResourceResolvers", namespace = "http://www.xmlsecurity.org/NS/configuration", required = true)
+    protected ResourceResolversType resourceResolvers;
+    @XmlAttribute(name = "target")
+    protected String target;
+
+    /**
+     * Gets the value of the properties property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link PropertiesType }
+     *     
+     */
+    public PropertiesType getProperties() {
+        return properties;
+    }
+
+    /**
+     * Sets the value of the properties property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link PropertiesType }
+     *     
+     */
+    public void setProperties(PropertiesType value) {
+        this.properties = value;
+    }
+
+    /**
+     * Gets the value of the securityHeaderHandlers property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link SecurityHeaderHandlersType }
+     *     
+     */
+    public SecurityHeaderHandlersType getSecurityHeaderHandlers() {
+        return securityHeaderHandlers;
+    }
+
+    /**
+     * Sets the value of the securityHeaderHandlers property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link SecurityHeaderHandlersType }
+     *     
+     */
+    public void setSecurityHeaderHandlers(SecurityHeaderHandlersType value) {
+        this.securityHeaderHandlers = value;
+    }
+
+    /**
+     * Gets the value of the transformAlgorithms property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link TransformAlgorithmsType }
+     *     
+     */
+    public TransformAlgorithmsType getTransformAlgorithms() {
+        return transformAlgorithms;
+    }
+
+    /**
+     * Sets the value of the transformAlgorithms property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link TransformAlgorithmsType }
+     *     
+     */
+    public void setTransformAlgorithms(TransformAlgorithmsType value) {
+        this.transformAlgorithms = value;
+    }
+
+    /**
+     * Gets the value of the jceAlgorithmMappings property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link JCEAlgorithmMappingsType }
+     *     
+     */
+    public JCEAlgorithmMappingsType getJCEAlgorithmMappings() {
+        return jceAlgorithmMappings;
+    }
+
+    /**
+     * Sets the value of the jceAlgorithmMappings property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link JCEAlgorithmMappingsType }
+     *     
+     */
+    public void setJCEAlgorithmMappings(JCEAlgorithmMappingsType value) {
+        this.jceAlgorithmMappings = value;
+    }
+
+    /**
+     * Gets the value of the resourceResolvers property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link ResourceResolversType }
+     *     
+     */
+    public ResourceResolversType getResourceResolvers() {
+        return resourceResolvers;
+    }
+
+    /**
+     * Sets the value of the resourceResolvers property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link ResourceResolversType }
+     *     
+     */
+    public void setResourceResolvers(ResourceResolversType value) {
+        this.resourceResolvers = value;
+    }
+
+    /**
+     * Gets the value of the target property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getTarget() {
+        return target;
+    }
+
+    /**
+     * Sets the value of the target property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setTarget(String value) {
+        this.target = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/HandlerType.java b/src/main/java/org/apache/xml/security/configuration/HandlerType.java
new file mode 100644
index 0000000..0566fa1
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/HandlerType.java
@@ -0,0 +1,148 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for HandlerType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="HandlerType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *       &lt;attribute name="NAME" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="JAVACLASS" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "HandlerType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "value"
+})
+public class HandlerType {
+
+    @XmlValue
+    protected String value;
+    @XmlAttribute(name = "NAME", required = true)
+    protected String name;
+    @XmlAttribute(name = "URI", required = true)
+    protected String uri;
+    @XmlAttribute(name = "JAVACLASS", required = true)
+    protected String javaclass;
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getNAME() {
+        return name;
+    }
+
+    /**
+     * Sets the value of the name property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setNAME(String value) {
+        this.name = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the javaclass property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getJAVACLASS() {
+        return javaclass;
+    }
+
+    /**
+     * Sets the value of the javaclass property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setJAVACLASS(String value) {
+        this.javaclass = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/InOutAttrType.java b/src/main/java/org/apache/xml/security/configuration/InOutAttrType.java
new file mode 100644
index 0000000..d3d0494
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/InOutAttrType.java
@@ -0,0 +1,45 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlEnum;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for inOutAttrType.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * <p>
+ * <pre>
+ * &lt;simpleType name="inOutAttrType"&gt;
+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
+ *     &lt;enumeration value="IN"/&gt;
+ *     &lt;enumeration value="OUT"/&gt;
+ *   &lt;/restriction&gt;
+ * &lt;/simpleType&gt;
+ * </pre>
+ * 
+ */
+@XmlType(name = "inOutAttrType", namespace = "http://www.xmlsecurity.org/NS/configuration")
+@XmlEnum
+public enum InOutAttrType {
+
+    IN,
+    OUT;
+
+    public String value() {
+        return name();
+    }
+
+    public static InOutAttrType fromValue(String v) {
+        return valueOf(v);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/JCEAlgorithmMappingsType.java b/src/main/java/org/apache/xml/security/configuration/JCEAlgorithmMappingsType.java
new file mode 100644
index 0000000..5ac246c
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/JCEAlgorithmMappingsType.java
@@ -0,0 +1,76 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for JCEAlgorithmMappingsType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="JCEAlgorithmMappingsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Algorithm" type="{http://www.xmlsecurity.org/NS/configuration}AlgorithmType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "JCEAlgorithmMappingsType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "algorithm"
+})
+public class JCEAlgorithmMappingsType {
+
+    @XmlElement(name = "Algorithm", namespace = "http://www.xmlsecurity.org/NS/configuration")
+    protected List<AlgorithmType> algorithm;
+
+    /**
+     * Gets the value of the algorithm property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the algorithm property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getAlgorithm().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link AlgorithmType }
+     * 
+     * 
+     */
+    public List<AlgorithmType> getAlgorithm() {
+        if (algorithm == null) {
+            algorithm = new ArrayList<AlgorithmType>();
+        }
+        return this.algorithm;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/ObjectFactory.java b/src/main/java/org/apache/xml/security/configuration/ObjectFactory.java
new file mode 100644
index 0000000..9572647
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/ObjectFactory.java
@@ -0,0 +1,140 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the org.apache.xml.security.configuration package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _Configuration_QNAME = new QName("http://www.xmlsecurity.org/NS/configuration", "Configuration");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.xml.security.configuration
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link ConfigurationType }
+     * 
+     */
+    public ConfigurationType createConfigurationType() {
+        return new ConfigurationType();
+    }
+
+    /**
+     * Create an instance of {@link AlgorithmType }
+     * 
+     */
+    public AlgorithmType createAlgorithmType() {
+        return new AlgorithmType();
+    }
+
+    /**
+     * Create an instance of {@link TransformAlgorithmType }
+     * 
+     */
+    public TransformAlgorithmType createTransformAlgorithmType() {
+        return new TransformAlgorithmType();
+    }
+
+    /**
+     * Create an instance of {@link ResolverType }
+     * 
+     */
+    public ResolverType createResolverType() {
+        return new ResolverType();
+    }
+
+    /**
+     * Create an instance of {@link PropertyType }
+     * 
+     */
+    public PropertyType createPropertyType() {
+        return new PropertyType();
+    }
+
+    /**
+     * Create an instance of {@link TransformAlgorithmsType }
+     * 
+     */
+    public TransformAlgorithmsType createTransformAlgorithmsType() {
+        return new TransformAlgorithmsType();
+    }
+
+    /**
+     * Create an instance of {@link HandlerType }
+     * 
+     */
+    public HandlerType createHandlerType() {
+        return new HandlerType();
+    }
+
+    /**
+     * Create an instance of {@link SecurityHeaderHandlersType }
+     * 
+     */
+    public SecurityHeaderHandlersType createSecurityHeaderHandlersType() {
+        return new SecurityHeaderHandlersType();
+    }
+
+    /**
+     * Create an instance of {@link PropertiesType }
+     * 
+     */
+    public PropertiesType createPropertiesType() {
+        return new PropertiesType();
+    }
+
+    /**
+     * Create an instance of {@link JCEAlgorithmMappingsType }
+     * 
+     */
+    public JCEAlgorithmMappingsType createJCEAlgorithmMappingsType() {
+        return new JCEAlgorithmMappingsType();
+    }
+
+    /**
+     * Create an instance of {@link ResourceResolversType }
+     * 
+     */
+    public ResourceResolversType createResourceResolversType() {
+        return new ResourceResolversType();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link ConfigurationType }{@code >}}
+     * 
+     */
+    @XmlElementDecl(namespace = "http://www.xmlsecurity.org/NS/configuration", name = "Configuration")
+    public JAXBElement<ConfigurationType> createConfiguration(ConfigurationType value) {
+        return new JAXBElement<ConfigurationType>(_Configuration_QNAME, ConfigurationType.class, null, value);
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/PropertiesType.java b/src/main/java/org/apache/xml/security/configuration/PropertiesType.java
new file mode 100644
index 0000000..22284f6
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/PropertiesType.java
@@ -0,0 +1,76 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for PropertiesType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="PropertiesType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Property" type="{http://www.xmlsecurity.org/NS/configuration}PropertyType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PropertiesType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "property"
+})
+public class PropertiesType {
+
+    @XmlElement(name = "Property", namespace = "http://www.xmlsecurity.org/NS/configuration")
+    protected List<PropertyType> property;
+
+    /**
+     * Gets the value of the property property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the property property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getProperty().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link PropertyType }
+     * 
+     * 
+     */
+    public List<PropertyType> getProperty() {
+        if (property == null) {
+            property = new ArrayList<PropertyType>();
+        }
+        return this.property;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/PropertyType.java b/src/main/java/org/apache/xml/security/configuration/PropertyType.java
new file mode 100644
index 0000000..2ada391
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/PropertyType.java
@@ -0,0 +1,121 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for PropertyType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="PropertyType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *       &lt;attribute name="NAME" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="VAL" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "PropertyType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "value"
+})
+public class PropertyType {
+
+    @XmlValue
+    protected String value;
+    @XmlAttribute(name = "NAME")
+    protected String name;
+    @XmlAttribute(name = "VAL")
+    protected String val;
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the name property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getNAME() {
+        return name;
+    }
+
+    /**
+     * Sets the value of the name property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setNAME(String value) {
+        this.name = value;
+    }
+
+    /**
+     * Gets the value of the val property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getVAL() {
+        return val;
+    }
+
+    /**
+     * Sets the value of the val property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setVAL(String value) {
+        this.val = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/ResolverType.java b/src/main/java/org/apache/xml/security/configuration/ResolverType.java
new file mode 100644
index 0000000..6f5b1d7
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/ResolverType.java
@@ -0,0 +1,121 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for ResolverType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="ResolverType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *       &lt;attribute name="JAVACLASS" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="DESCRIPTION" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ResolverType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "value"
+})
+public class ResolverType {
+
+    @XmlValue
+    protected String value;
+    @XmlAttribute(name = "JAVACLASS", required = true)
+    protected String javaclass;
+    @XmlAttribute(name = "DESCRIPTION", required = true)
+    protected String description;
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the javaclass property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getJAVACLASS() {
+        return javaclass;
+    }
+
+    /**
+     * Sets the value of the javaclass property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setJAVACLASS(String value) {
+        this.javaclass = value;
+    }
+
+    /**
+     * Gets the value of the description property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getDESCRIPTION() {
+        return description;
+    }
+
+    /**
+     * Sets the value of the description property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setDESCRIPTION(String value) {
+        this.description = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/ResourceResolversType.java b/src/main/java/org/apache/xml/security/configuration/ResourceResolversType.java
new file mode 100644
index 0000000..4f6f3c6
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/ResourceResolversType.java
@@ -0,0 +1,76 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for ResourceResolversType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="ResourceResolversType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Resolver" type="{http://www.xmlsecurity.org/NS/configuration}ResolverType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ResourceResolversType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "resolver"
+})
+public class ResourceResolversType {
+
+    @XmlElement(name = "Resolver", namespace = "http://www.xmlsecurity.org/NS/configuration")
+    protected List<ResolverType> resolver;
+
+    /**
+     * Gets the value of the resolver property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the resolver property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getResolver().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link ResolverType }
+     * 
+     * 
+     */
+    public List<ResolverType> getResolver() {
+        if (resolver == null) {
+            resolver = new ArrayList<ResolverType>();
+        }
+        return this.resolver;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/SecurityHeaderHandlersType.java b/src/main/java/org/apache/xml/security/configuration/SecurityHeaderHandlersType.java
new file mode 100644
index 0000000..3a3d903
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/SecurityHeaderHandlersType.java
@@ -0,0 +1,76 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for SecurityHeaderHandlersType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="SecurityHeaderHandlersType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="Handler" type="{http://www.xmlsecurity.org/NS/configuration}HandlerType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SecurityHeaderHandlersType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "handler"
+})
+public class SecurityHeaderHandlersType {
+
+    @XmlElement(name = "Handler", namespace = "http://www.xmlsecurity.org/NS/configuration")
+    protected List<HandlerType> handler;
+
+    /**
+     * Gets the value of the handler property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the handler property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getHandler().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link HandlerType }
+     * 
+     * 
+     */
+    public List<HandlerType> getHandler() {
+        if (handler == null) {
+            handler = new ArrayList<HandlerType>();
+        }
+        return this.handler;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmType.java b/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmType.java
new file mode 100644
index 0000000..e9db9ac
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmType.java
@@ -0,0 +1,148 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ * <p>Java class for TransformAlgorithmType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="TransformAlgorithmType"&gt;
+ *   &lt;simpleContent&gt;
+ *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema&gt;string"&gt;
+ *       &lt;attribute name="URI" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="JAVACLASS" use="required" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
+ *       &lt;attribute name="INOUT" type="{http://www.xmlsecurity.org/NS/configuration}inOutAttrType" /&gt;
+ *     &lt;/extension&gt;
+ *   &lt;/simpleContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TransformAlgorithmType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "value"
+})
+public class TransformAlgorithmType {
+
+    @XmlValue
+    protected String value;
+    @XmlAttribute(name = "URI", required = true)
+    protected String uri;
+    @XmlAttribute(name = "JAVACLASS", required = true)
+    protected String javaclass;
+    @XmlAttribute(name = "INOUT")
+    protected InOutAttrType inout;
+
+    /**
+     * Gets the value of the value property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the value of the value property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the uri property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getURI() {
+        return uri;
+    }
+
+    /**
+     * Sets the value of the uri property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setURI(String value) {
+        this.uri = value;
+    }
+
+    /**
+     * Gets the value of the javaclass property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getJAVACLASS() {
+        return javaclass;
+    }
+
+    /**
+     * Sets the value of the javaclass property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setJAVACLASS(String value) {
+        this.javaclass = value;
+    }
+
+    /**
+     * Gets the value of the inout property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link InOutAttrType }
+     *     
+     */
+    public InOutAttrType getINOUT() {
+        return inout;
+    }
+
+    /**
+     * Sets the value of the inout property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link InOutAttrType }
+     *     
+     */
+    public void setINOUT(InOutAttrType value) {
+        this.inout = value;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmsType.java b/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmsType.java
new file mode 100644
index 0000000..1b6e987
--- /dev/null
+++ b/src/main/java/org/apache/xml/security/configuration/TransformAlgorithmsType.java
@@ -0,0 +1,76 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 
+// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
+// Any modifications to this file will be lost upon recompilation of the source schema. 
+// Generated on: 2017.07.31 at 11:10:09 AM IST 
+//
+
+
+package org.apache.xml.security.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>Java class for TransformAlgorithmsType complex type.
+ * 
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ * 
+ * <pre>
+ * &lt;complexType name="TransformAlgorithmsType"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="TransformAlgorithm" type="{http://www.xmlsecurity.org/NS/configuration}TransformAlgorithmType" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TransformAlgorithmsType", namespace = "http://www.xmlsecurity.org/NS/configuration", propOrder = {
+    "transformAlgorithm"
+})
+public class TransformAlgorithmsType {
+
+    @XmlElement(name = "TransformAlgorithm", namespace = "http://www.xmlsecurity.org/NS/configuration")
+    protected List<TransformAlgorithmType> transformAlgorithm;
+
+    /**
+     * Gets the value of the transformAlgorithm property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the transformAlgorithm property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getTransformAlgorithm().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link TransformAlgorithmType }
+     * 
+     * 
+     */
+    public List<TransformAlgorithmType> getTransformAlgorithm() {
+        if (transformAlgorithm == null) {
+            transformAlgorithm = new ArrayList<TransformAlgorithmType>();
+        }
+        return this.transformAlgorithm;
+    }
+
+}
diff --git a/src/main/java/org/apache/xml/security/encryption/AbstractSerializer.java b/src/main/java/org/apache/xml/security/encryption/AbstractSerializer.java
index 99fb947..eaa8fba 100644
--- a/src/main/java/org/apache/xml/security/encryption/AbstractSerializer.java
+++ b/src/main/java/org/apache/xml/security/encryption/AbstractSerializer.java
@@ -226,7 +226,8 @@
 
     protected static String createContext(String source, Node ctx) {
         // Create the context to parse the document against
-        StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?><dummy");
+        StringBuilder sb = new StringBuilder();
+        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><dummy");
 
         // Run through each node up to the document node and find any xmlns: nodes
         Map<String, String> storedNamespaces = new HashMap<>();
@@ -239,18 +240,18 @@
                     String nodeName = att.getNodeName();
                     if (("xmlns".equals(nodeName) || nodeName.startsWith("xmlns:"))
                         && !storedNamespaces.containsKey(att.getNodeName())) {
-                        sb.append(' ');
+                        sb.append(" ");
                         sb.append(nodeName);
                         sb.append("=\"");
                         sb.append(att.getNodeValue());
-                        sb.append('\"');
+                        sb.append("\"");
                         storedNamespaces.put(nodeName, att.getNodeValue());
                     }
                 }
             }
             wk = wk.getParentNode();
         }
-        sb.append('>');
+        sb.append(">");
         sb.append(source);
         sb.append("</dummy>");
         return sb.toString();
diff --git a/src/main/java/org/apache/xml/security/encryption/DocumentSerializer.java b/src/main/java/org/apache/xml/security/encryption/DocumentSerializer.java
index a35ff71..3c7ce3c 100644
--- a/src/main/java/org/apache/xml/security/encryption/DocumentSerializer.java
+++ b/src/main/java/org/apache/xml/security/encryption/DocumentSerializer.java
@@ -23,6 +23,7 @@
 import java.io.InputStream;
 import java.io.StringReader;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.xml.security.utils.XMLUtils;
@@ -69,8 +70,10 @@
      * @throws XMLEncryptionException
      */
     private Node deserialize(Node ctx, InputSource inputSource) throws XMLEncryptionException {
+        DocumentBuilder db = null;
         try {
-            Document d = XMLUtils.read(inputSource, secureValidation);
+            db = XMLUtils.createDocumentBuilder(false, secureValidation);
+            Document d = db.parse(inputSource);
 
             Document contextDocument = null;
             if (Node.DOCUMENT_NODE == ctx.getNodeType()) {
@@ -95,6 +98,10 @@
             throw new XMLEncryptionException(pce);
         } catch (IOException ioe) {
             throw new XMLEncryptionException(ioe);
+        } finally {
+            if (db != null) {
+                XMLUtils.repoolDocumentBuilder(db);
+            }
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/encryption/XMLCipher.java b/src/main/java/org/apache/xml/security/encryption/XMLCipher.java
index c2ca9cd..51eab84 100644
--- a/src/main/java/org/apache/xml/security/encryption/XMLCipher.java
+++ b/src/main/java/org/apache/xml/security/encryption/XMLCipher.java
@@ -1864,12 +1864,14 @@
         EncryptedData result = null;
         CipherData data = null;
 
-        if (CipherData.REFERENCE_TYPE == type) {
+        switch (type) {
+        case CipherData.REFERENCE_TYPE:
             CipherReference cipherReference = factory.newCipherReference(value);
             data = factory.newCipherData(type);
             data.setCipherReference(cipherReference);
             result = factory.newEncryptedData(data);
-        } else if (CipherData.VALUE_TYPE == type) {
+            break;
+        case CipherData.VALUE_TYPE:
             CipherValue cipherValue = factory.newCipherValue(value);
             data = factory.newCipherData(type);
             data.setCipherValue(cipherValue);
@@ -1917,12 +1919,14 @@
         EncryptedKey result = null;
         CipherData data = null;
 
-        if (CipherData.REFERENCE_TYPE == type) {
+        switch (type) {
+        case CipherData.REFERENCE_TYPE:
             CipherReference cipherReference = factory.newCipherReference(value);
             data = factory.newCipherData(type);
             data.setCipherReference(cipherReference);
             result = factory.newEncryptedKey(data);
-        } else if (CipherData.VALUE_TYPE == type) {
+            break;
+        case CipherData.VALUE_TYPE:
             CipherValue cipherValue = factory.newCipherValue(value);
             data = factory.newCipherData(type);
             data.setCipherValue(cipherValue);
@@ -2478,7 +2482,8 @@
 
             ReferenceList result = new ReferenceListImpl(type);
             NodeList list = null;
-            if (ReferenceList.DATA_REFERENCE == type) {
+            switch (type) {
+            case ReferenceList.DATA_REFERENCE:
                 list =
                     element.getElementsByTagNameNS(
                         EncryptionConstants.EncryptionSpecNS,
@@ -2488,7 +2493,8 @@
                     String uri = ((Element) list.item(i)).getAttributeNS(null, "URI");
                     result.add(result.newDataReference(uri));
                 }
-            } else if (ReferenceList.KEY_REFERENCE == type) {
+                break;
+            case ReferenceList.KEY_REFERENCE:
                 list =
                     element.getElementsByTagNameNS(
                         EncryptionConstants.EncryptionSpecNS,
@@ -2538,7 +2544,7 @@
              * @param algorithm
              */
             public AgreementMethodImpl(String algorithm) {
-                agreementMethodInformation = new LinkedList<>();
+                agreementMethodInformation = new LinkedList<Element>();
                 URI tmpAlgorithm = null;
                 try {
                     tmpAlgorithm = new URI(algorithm);
@@ -3086,7 +3092,7 @@
                     new IllegalArgumentException().initCause(ex);
                 }
                 this.algorithm = tmpAlgorithm.toString();
-                encryptionMethodInformation = new LinkedList<>();
+                encryptionMethodInformation = new LinkedList<Element>();
             }
 
             /** {@inheritDoc} */
@@ -3211,7 +3217,7 @@
              * Constructor.
              */
             public EncryptionPropertiesImpl() {
-                encryptionProperties = new LinkedList<>();
+                encryptionProperties = new LinkedList<EncryptionProperty>();
             }
 
             /** {@inheritDoc} */
@@ -3266,7 +3272,7 @@
              * Constructor.
              */
             public EncryptionPropertyImpl() {
-                encryptionInformation = new LinkedList<>();
+                encryptionInformation = new LinkedList<Element>();
             }
 
             /** {@inheritDoc} */
@@ -3278,7 +3284,7 @@
             public void setTarget(String target) {
                 if (target == null || target.length() == 0) {
                     this.target = null;
-                } else if (target.charAt(0) == '#') {
+                } else if (target.startsWith("#")) {
                     /*
                      * This is a same document URI reference. Do not parse,
                      * because it has no scheme.
@@ -3440,7 +3446,7 @@
                 } else {
                     throw new IllegalArgumentException();
                 }
-                references = new LinkedList<>();
+                references = new LinkedList<Reference>();
             }
 
             /** {@inheritDoc} */
@@ -3511,7 +3517,7 @@
 
                 ReferenceImpl(String uri) {
                     this.uri = uri;
-                    referenceInformation = new LinkedList<>();
+                    referenceInformation = new LinkedList<Element>();
                 }
 
                 /** {@inheritDoc} */
diff --git a/src/main/java/org/apache/xml/security/encryption/XMLCipherInput.java b/src/main/java/org/apache/xml/security/encryption/XMLCipherInput.java
index feafe99..806bab8 100644
--- a/src/main/java/org/apache/xml/security/encryption/XMLCipherInput.java
+++ b/src/main/java/org/apache/xml/security/encryption/XMLCipherInput.java
@@ -96,7 +96,7 @@
      * @throws XMLEncryptionException
      * @return The decripted bytes.
      */
-    public byte[] getBytes() throws XMLEncryptionException {  //NOPMD
+    public byte[] getBytes() throws XMLEncryptionException {
         if (mode == XMLCipher.DECRYPT_MODE) {
             return getDecryptBytes();
         }
diff --git a/src/main/java/org/apache/xml/security/encryption/XMLEncryptionException.java b/src/main/java/org/apache/xml/security/encryption/XMLEncryptionException.java
index 916207c..579cc9b 100644
--- a/src/main/java/org/apache/xml/security/encryption/XMLEncryptionException.java
+++ b/src/main/java/org/apache/xml/security/encryption/XMLEncryptionException.java
@@ -77,7 +77,7 @@
      * @param msgID
      * @param exArgs
      */
-    public XMLEncryptionException(Exception originalException, String msgID, Object[] exArgs) {
+    public XMLEncryptionException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/exceptions/AlgorithmAlreadyRegisteredException.java b/src/main/java/org/apache/xml/security/exceptions/AlgorithmAlreadyRegisteredException.java
index 5c37ef6..c936cf6 100644
--- a/src/main/java/org/apache/xml/security/exceptions/AlgorithmAlreadyRegisteredException.java
+++ b/src/main/java/org/apache/xml/security/exceptions/AlgorithmAlreadyRegisteredException.java
@@ -47,7 +47,7 @@
      * @param msgID
      * @param exArgs
      */
-    public AlgorithmAlreadyRegisteredException(String msgID, Object[] exArgs) {
+    public AlgorithmAlreadyRegisteredException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -74,7 +74,7 @@
      * @param exArgs
      */
     public AlgorithmAlreadyRegisteredException(
-        Exception originalException, String msgID, Object[] exArgs
+        Exception originalException, String msgID, Object exArgs[]
     ) {
         super(originalException, msgID, exArgs);
     }
diff --git a/src/main/java/org/apache/xml/security/exceptions/Base64DecodingException.java b/src/main/java/org/apache/xml/security/exceptions/Base64DecodingException.java
index 29d96c7..77f3473 100644
--- a/src/main/java/org/apache/xml/security/exceptions/Base64DecodingException.java
+++ b/src/main/java/org/apache/xml/security/exceptions/Base64DecodingException.java
@@ -49,7 +49,7 @@
      * @param msgID
      * @param exArgs
      */
-    public Base64DecodingException(String msgID, Object[] exArgs) {
+    public Base64DecodingException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -75,7 +75,7 @@
      * @param msgID
      * @param exArgs
      */
-    public Base64DecodingException(Exception originalException, String msgID, Object[] exArgs) {
+    public Base64DecodingException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/exceptions/XMLSecurityException.java b/src/main/java/org/apache/xml/security/exceptions/XMLSecurityException.java
index 013c1a4..3c76df0 100644
--- a/src/main/java/org/apache/xml/security/exceptions/XMLSecurityException.java
+++ b/src/main/java/org/apache/xml/security/exceptions/XMLSecurityException.java
@@ -34,7 +34,7 @@
  * Usage in the Java source is:
  * <pre>
  * {
- *    Object[] exArgs = { Constants._TAG_TRANSFORMS, "BadElement" };
+ *    Object exArgs[] = { Constants._TAG_TRANSFORMS, "BadElement" };
  *
  *    throw new XMLSecurityException("xml.WrongElement", exArgs);
  * }
@@ -45,7 +45,7 @@
  * try {
  *    ...
  * } catch (Exception oldEx) {
- *    Object[] exArgs = { Constants._TAG_TRANSFORMS, "BadElement" };
+ *    Object exArgs[] = { Constants._TAG_TRANSFORMS, "BadElement" };
  *
  *    throw new XMLSecurityException("xml.WrongElement", exArgs, oldEx);
  * }
diff --git a/src/main/java/org/apache/xml/security/exceptions/XMLSecurityRuntimeException.java b/src/main/java/org/apache/xml/security/exceptions/XMLSecurityRuntimeException.java
index b889f77..5f63179 100644
--- a/src/main/java/org/apache/xml/security/exceptions/XMLSecurityRuntimeException.java
+++ b/src/main/java/org/apache/xml/security/exceptions/XMLSecurityRuntimeException.java
@@ -35,7 +35,7 @@
  * Usage in the Java source is:
  * <pre>
  * {
- *    Object[] exArgs = { Constants._TAG_TRANSFORMS, "BadElement" };
+ *    Object exArgs[] = { Constants._TAG_TRANSFORMS, "BadElement" };
  *
  *    throw new XMLSecurityException("xml.WrongElement", exArgs);
  * }
@@ -46,7 +46,7 @@
  * try {
  *    ...
  * } catch (Exception oldEx) {
- *    Object[] exArgs = { Constants._TAG_TRANSFORMS, "BadElement" };
+ *    Object exArgs[] = { Constants._TAG_TRANSFORMS, "BadElement" };
  *
  *    throw new XMLSecurityException("xml.WrongElement", exArgs, oldEx);
  * }
@@ -88,7 +88,7 @@
      * @param msgID
      * @param exArgs
      */
-    public XMLSecurityRuntimeException(String msgID, Object[] exArgs) {
+    public XMLSecurityRuntimeException(String msgID, Object exArgs[]) {
         super(MessageFormat.format(I18n.getExceptionMessage(msgID), exArgs));
 
         this.msgID = msgID;
@@ -126,7 +126,7 @@
      * @param exArgs
      * @param originalException
      */
-    public XMLSecurityRuntimeException(String msgID, Object[] exArgs, Exception originalException) {
+    public XMLSecurityRuntimeException(String msgID, Object exArgs[], Exception originalException) {
         super(MessageFormat.format(I18n.getExceptionMessage(msgID), exArgs), originalException);
 
         this.msgID = msgID;
diff --git a/src/main/java/org/apache/xml/security/keys/ContentHandlerAlreadyRegisteredException.java b/src/main/java/org/apache/xml/security/keys/ContentHandlerAlreadyRegisteredException.java
index 0af58e1..2d3a8de 100644
--- a/src/main/java/org/apache/xml/security/keys/ContentHandlerAlreadyRegisteredException.java
+++ b/src/main/java/org/apache/xml/security/keys/ContentHandlerAlreadyRegisteredException.java
@@ -50,7 +50,7 @@
      * @param msgID
      * @param exArgs
      */
-    public ContentHandlerAlreadyRegisteredException(String msgID, Object[] exArgs) {
+    public ContentHandlerAlreadyRegisteredException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -77,7 +77,7 @@
      * @param exArgs
      */
     public ContentHandlerAlreadyRegisteredException(
-        Exception originalException, String msgID, Object[] exArgs
+        Exception originalException, String msgID, Object exArgs[]
     ) {
         super(originalException, msgID, exArgs);
     }
diff --git a/src/main/java/org/apache/xml/security/keys/content/DEREncodedKeyValue.java b/src/main/java/org/apache/xml/security/keys/content/DEREncodedKeyValue.java
index f2eeb61..ef55804 100644
--- a/src/main/java/org/apache/xml/security/keys/content/DEREncodedKeyValue.java
+++ b/src/main/java/org/apache/xml/security/keys/content/DEREncodedKeyValue.java
@@ -37,7 +37,7 @@
 public class DEREncodedKeyValue extends Signature11ElementProxy implements KeyInfoContent {
 
     /** JCA algorithm key types supported by this implementation. */
-    private static final String[] supportedKeyTypes = { "RSA", "DSA", "EC"};
+    private static final String supportedKeyTypes[] = { "RSA", "DSA", "EC"};
 
     /**
      * Constructor DEREncodedKeyValue
@@ -137,10 +137,10 @@
             X509EncodedKeySpec keySpec = keyFactory.getKeySpec(publicKey, X509EncodedKeySpec.class);
             return keySpec.getEncoded();
         } catch (NoSuchAlgorithmException e) {
-            Object[] exArgs = { publicKey.getAlgorithm(), publicKey.getFormat(), publicKey.getClass().getName() };
+            Object exArgs[] = { publicKey.getAlgorithm(), publicKey.getFormat(), publicKey.getClass().getName() };
             throw new XMLSecurityException(e, "DEREncodedKeyValue.UnsupportedPublicKey", exArgs);
         } catch (InvalidKeySpecException e) {
-            Object[] exArgs = { publicKey.getAlgorithm(), publicKey.getFormat(), publicKey.getClass().getName() };
+            Object exArgs[] = { publicKey.getAlgorithm(), publicKey.getFormat(), publicKey.getClass().getName() };
             throw new XMLSecurityException(e, "DEREncodedKeyValue.UnsupportedPublicKey", exArgs);
         }
     }
diff --git a/src/main/java/org/apache/xml/security/keys/content/X509Data.java b/src/main/java/org/apache/xml/security/keys/content/X509Data.java
index bbeff11..76a5ae5 100644
--- a/src/main/java/org/apache/xml/security/keys/content/X509Data.java
+++ b/src/main/java/org/apache/xml/security/keys/content/X509Data.java
@@ -67,7 +67,7 @@
         }
         if (sibling == null || sibling.getNodeType() != Node.ELEMENT_NODE) {
             /* No Elements found */
-            Object[] exArgs = { "Elements", Constants._TAG_X509DATA };
+            Object exArgs[] = { "Elements", Constants._TAG_X509DATA };
             throw new XMLSecurityException("xml.WrongContent", exArgs);
         }
     }
diff --git a/src/main/java/org/apache/xml/security/keys/content/keyvalues/DSAKeyValue.java b/src/main/java/org/apache/xml/security/keys/content/keyvalues/DSAKeyValue.java
index dbe6538..23a96e9 100644
--- a/src/main/java/org/apache/xml/security/keys/content/keyvalues/DSAKeyValue.java
+++ b/src/main/java/org/apache/xml/security/keys/content/keyvalues/DSAKeyValue.java
@@ -86,7 +86,7 @@
             this.addBigIntegerElement(params.getG(), Constants._TAG_G);
             this.addBigIntegerElement(((DSAPublicKey) key).getY(), Constants._TAG_Y);
         } else {
-            Object[] exArgs = { Constants._TAG_DSAKEYVALUE, key.getClass().getName() };
+            Object exArgs[] = { Constants._TAG_DSAKEYVALUE, key.getClass().getName() };
 
             throw new IllegalArgumentException(I18n.translate("KeyValue.IllegalArgument", exArgs));
         }
diff --git a/src/main/java/org/apache/xml/security/keys/content/keyvalues/RSAKeyValue.java b/src/main/java/org/apache/xml/security/keys/content/keyvalues/RSAKeyValue.java
index b0280bd..6be3dd7 100644
--- a/src/main/java/org/apache/xml/security/keys/content/keyvalues/RSAKeyValue.java
+++ b/src/main/java/org/apache/xml/security/keys/content/keyvalues/RSAKeyValue.java
@@ -82,7 +82,7 @@
                 ((RSAPublicKey) key).getPublicExponent(), Constants._TAG_EXPONENT
             );
         } else {
-            Object[] exArgs = { Constants._TAG_RSAKEYVALUE, key.getClass().getName() };
+            Object exArgs[] = { Constants._TAG_RSAKEYVALUE, key.getClass().getName() };
 
             throw new IllegalArgumentException(I18n.translate("KeyValue.IllegalArgument", exArgs));
         }
diff --git a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Certificate.java b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Certificate.java
index 0b5e91f..878e69b 100644
--- a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Certificate.java
+++ b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Certificate.java
@@ -96,7 +96,7 @@
      * @throws XMLSecurityException
      */
     public X509Certificate getX509Certificate() throws XMLSecurityException {
-        byte[] certbytes = this.getCertificateBytes();
+        byte certbytes[] = this.getCertificateBytes();
         try (InputStream is = new ByteArrayInputStream(certbytes)) {
             CertificateFactory certFact =
                 CertificateFactory.getInstance(XMLX509Certificate.JCA_CERT_ID);
diff --git a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Digest.java b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Digest.java
index 6a682da..e2fd8e8 100644
--- a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Digest.java
+++ b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509Digest.java
@@ -113,7 +113,7 @@
     public static byte[] getDigestBytesFromCert(X509Certificate cert, String algorithmURI) throws XMLSecurityException {
         String jcaDigestAlgorithm = JCEMapper.translateURItoJCEID(algorithmURI);
         if (jcaDigestAlgorithm == null) {
-                Object[] exArgs = { algorithmURI };
+                Object exArgs[] = { algorithmURI };
                 throw new XMLSecurityException("XMLX509Digest.UnknownDigestAlgorithm", exArgs);
         }
 
@@ -121,7 +121,7 @@
                         MessageDigest md = MessageDigest.getInstance(jcaDigestAlgorithm);
                         return md.digest(cert.getEncoded());
                 } catch (Exception e) {
-                Object[] exArgs = { jcaDigestAlgorithm };
+                Object exArgs[] = { jcaDigestAlgorithm };
                         throw new XMLSecurityException("XMLX509Digest.FailedDigest", exArgs);
                 }
 
diff --git a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509SKI.java b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509SKI.java
index c18922b..d188e5b 100644
--- a/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509SKI.java
+++ b/src/main/java/org/apache/xml/security/keys/content/x509/XMLX509SKI.java
@@ -108,7 +108,7 @@
         throws XMLSecurityException {
 
         if (cert.getVersion() < 3) {
-            Object[] exArgs = { cert.getVersion() };
+            Object exArgs[] = { cert.getVersion() };
             throw new XMLSecurityException("certificate.noSki.lowVersion", exArgs);
         }
 
@@ -129,7 +129,7 @@
          * OCTET STRING, and the next two bytes are the tag and length of
          * the ski OCTET STRING.
          */
-        byte[] skidValue = new byte[extensionValue.length - 4];
+        byte skidValue[] = new byte[extensionValue.length - 4];
 
         System.arraycopy(extensionValue, 4, skidValue, 0, skidValue.length);
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/InvalidKeyResolverException.java b/src/main/java/org/apache/xml/security/keys/keyresolver/InvalidKeyResolverException.java
index 5a9f856..324d399 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/InvalidKeyResolverException.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/InvalidKeyResolverException.java
@@ -50,7 +50,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidKeyResolverException(String msgID, Object[] exArgs) {
+    public InvalidKeyResolverException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -76,7 +76,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidKeyResolverException(Exception originalException, String msgID, Object[] exArgs) {
+    public InvalidKeyResolverException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java
index 82541e5..e123a0c 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java
@@ -54,7 +54,7 @@
         org.slf4j.LoggerFactory.getLogger(KeyResolver.class);
 
     /** Field resolverVector */
-    private static List<KeyResolver> resolverVector = new CopyOnWriteArrayList<>();
+    private static List<KeyResolver> resolverVector = new CopyOnWriteArrayList<KeyResolver>();
 
     /** Field resolverSpi */
     private final KeyResolverSpi resolverSpi;
@@ -92,7 +92,7 @@
     ) throws KeyResolverException {
         for (KeyResolver resolver : resolverVector) {
             if (resolver == null) {
-                Object[] exArgs = {
+                Object exArgs[] = {
                                    element != null
                                        && element.getNodeType() == Node.ELEMENT_NODE
                                        ? element.getTagName() : "null"
@@ -108,7 +108,7 @@
             }
         }
 
-        Object[] exArgs = {
+        Object exArgs[] = {
                            element != null && element.getNodeType() == Node.ELEMENT_NODE
                            ? element.getTagName() : "null"
                           };
@@ -131,7 +131,7 @@
     ) throws KeyResolverException {
         for (KeyResolver resolver : resolverVector) {
             if (resolver == null) {
-                Object[] exArgs = {
+                Object exArgs[] = {
                                    element != null
                                        && element.getNodeType() == Node.ELEMENT_NODE
                                        ? element.getTagName() : "null"
@@ -147,7 +147,7 @@
             }
         }
 
-        Object[] exArgs = {
+        Object exArgs[] = {
                            element != null && element.getNodeType() == Node.ELEMENT_NODE
                            ? element.getTagName() : "null"
                           };
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverException.java b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverException.java
index 7ed3ab4..accf56e 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverException.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverException.java
@@ -54,7 +54,7 @@
      * @param msgID
      * @param exArgs
      */
-    public KeyResolverException(String msgID, Object[] exArgs) {
+    public KeyResolverException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -80,7 +80,7 @@
      * @param msgID
      * @param exArgs
      */
-    public KeyResolverException(Exception originalException, String msgID, Object[] exArgs) {
+    public KeyResolverException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java
index f5456a6..7f96c65 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.xml.security.keys.storage.StorageResolver;
@@ -270,8 +271,10 @@
      * @throws KeyResolverException if something goes wrong
      */
     protected static Element getDocFromBytes(byte[] bytes, boolean secureValidation) throws KeyResolverException {
+        DocumentBuilder db = null;
         try (InputStream is = new ByteArrayInputStream(bytes)) {
-            Document doc = XMLUtils.read(is, secureValidation);
+            db = XMLUtils.createDocumentBuilder(false, secureValidation);
+            Document doc = db.parse(is);
             return doc.getDocumentElement();
         } catch (SAXException ex) {
             throw new KeyResolverException(ex);
@@ -279,6 +282,10 @@
             throw new KeyResolverException(ex);
         } catch (ParserConfigurationException ex) {
             throw new KeyResolverException(ex);
+        } finally {
+            if (db != null) {
+                XMLUtils.repoolDocumentBuilder(db);
+            }
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/KeyInfoReferenceResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/KeyInfoReferenceResolver.java
index 81727b2..4571cc3 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/KeyInfoReferenceResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/KeyInfoReferenceResolver.java
@@ -189,7 +189,7 @@
      */
     private void validateReference(Element referentElement) throws XMLSecurityException {
         if (!XMLUtils.elementIsInSignatureSpace(referentElement, Constants._TAG_KEYINFO)) {
-            Object[] exArgs = { new QName(referentElement.getNamespaceURI(), referentElement.getLocalName()) };
+            Object exArgs[] = { new QName(referentElement.getNamespaceURI(), referentElement.getLocalName()) };
             throw new XMLSecurityException("KeyInfoReferenceResolver.InvalidReferentElement.WrongType", exArgs);
         }
 
@@ -245,7 +245,7 @@
             return null;
         } else {
             // Retrieved resource is a byte stream
-            byte[] inputBytes = resource.getBytes();
+            byte inputBytes[] = resource.getBytes();
             e = getDocFromBytes(inputBytes, this.secureValidation);
         }
         return e;
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/PrivateKeyResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/PrivateKeyResolver.java
index 8b627ac..3ef4458 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/PrivateKeyResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/PrivateKeyResolver.java
@@ -72,8 +72,12 @@
      * @return whether the KeyResolverSpi is able to perform the requested action.
      */
     public boolean engineCanResolve(Element element, String baseURI, StorageResolver storage) {
-        return XMLUtils.elementIsInSignatureSpace(element, Constants._TAG_X509DATA)
-            || XMLUtils.elementIsInSignatureSpace(element, Constants._TAG_KEYNAME);
+        if (XMLUtils.elementIsInSignatureSpace(element, Constants._TAG_X509DATA)
+            || XMLUtils.elementIsInSignatureSpace(element, Constants._TAG_KEYNAME)) {
+            return true;
+        }
+
+        return false;
     }
 
     /**
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/RetrievalMethodResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
index 611e494..126cd09 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
@@ -243,7 +243,7 @@
             e = getDocumentElement(resource.getNodeSet());
         } else {
             // Retrieved resource is an inputStream
-            byte[] inputBytes = resource.getBytes();
+            byte inputBytes[] = resource.getBytes();
             e = getDocFromBytes(inputBytes, secureValidation);
             // otherwise, we parse the resource, create an Element and delegate
             LOG.debug("we have to parse {} bytes", inputBytes.length);
@@ -253,7 +253,7 @@
 
     private static X509Certificate getRawCertificate(XMLSignatureInput resource)
         throws CanonicalizationException, IOException, CertificateException {
-        byte[] inputBytes = resource.getBytes();
+        byte inputBytes[] = resource.getBytes();
         // if the resource stores a raw certificate, we have to handle it
         CertificateFactory certFact =
             CertificateFactory.getInstance(XMLX509Certificate.JCA_CERT_ID);
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509DigestResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509DigestResolver.java
index f82fe0b..ad1bd79 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509DigestResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509DigestResolver.java
@@ -158,7 +158,7 @@
      */
     private void checkStorage(StorageResolver storage) throws KeyResolverException {
         if (storage == null) {
-            Object[] exArgs = { Constants._TAG_X509DIGEST };
+            Object exArgs[] = { Constants._TAG_X509DIGEST };
             KeyResolverException ex = new KeyResolverException("KeyResolver.needStorageResolver", exArgs);
             LOG.debug("", ex);
             throw ex;
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
index d7086dc..39dcca2 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
@@ -76,7 +76,7 @@
         }
         try {
             if (storage == null) {
-                Object[] exArgs = { Constants._TAG_X509ISSUERSERIAL };
+                Object exArgs[] = { Constants._TAG_X509ISSUERSERIAL };
                 KeyResolverException ex =
                     new KeyResolverException("KeyResolver.needStorageResolver", exArgs);
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SKIResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SKIResolver.java
index 2c33c19..069bde5 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SKIResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SKIResolver.java
@@ -91,7 +91,7 @@
         }
         try {
             if (storage == null) {
-                Object[] exArgs = { Constants._TAG_X509SKI };
+                Object exArgs[] = { Constants._TAG_X509SKI };
                 KeyResolverException ex =
                     new KeyResolverException("KeyResolver.needStorageResolver", exArgs);
 
diff --git a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SubjectNameResolver.java b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
index 8f78227..2b3cf06 100644
--- a/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
@@ -92,7 +92,7 @@
 
         try {
             if (storage == null) {
-                Object[] exArgs = { Constants._TAG_X509SUBJECTNAME };
+                Object exArgs[] = { Constants._TAG_X509SUBJECTNAME };
                 KeyResolverException ex =
                     new KeyResolverException("KeyResolver.needStorageResolver", exArgs);
 
diff --git a/src/main/java/org/apache/xml/security/keys/storage/StorageResolverException.java b/src/main/java/org/apache/xml/security/keys/storage/StorageResolverException.java
index 1f7b1df..c17dafe 100644
--- a/src/main/java/org/apache/xml/security/keys/storage/StorageResolverException.java
+++ b/src/main/java/org/apache/xml/security/keys/storage/StorageResolverException.java
@@ -55,7 +55,7 @@
      * @param msgID
      * @param exArgs
      */
-    public StorageResolverException(String msgID, Object[] exArgs) {
+    public StorageResolverException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -81,7 +81,7 @@
      * @param msgID
      * @param exArgs
      */
-    public StorageResolverException(Exception originalException, String msgID, Object[] exArgs) {
+    public StorageResolverException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java b/src/main/java/org/apache/xml/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
index fe7523d..e05d50f 100644
--- a/src/main/java/org/apache/xml/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
+++ b/src/main/java/org/apache/xml/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
@@ -36,6 +36,7 @@
 
 import org.apache.xml.security.keys.storage.StorageResolverException;
 import org.apache.xml.security.keys.storage.StorageResolverSpi;
+import org.apache.xml.security.utils.XMLUtils;
 
 /**
  * This {@link StorageResolverSpi} makes all raw (binary) {@link X509Certificate}s
@@ -183,4 +184,32 @@
         }
     }
 
+    /**
+     * Method main
+     *
+     * @param unused
+     * @throws Exception
+     */
+    public static void main(String unused[]) throws Exception {
+
+        CertsInFilesystemDirectoryResolver krs =
+            new CertsInFilesystemDirectoryResolver(
+                "data/ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/certs");
+
+        for (Iterator<Certificate> i = krs.getIterator(); i.hasNext(); ) {
+            X509Certificate cert = (X509Certificate) i.next();
+            byte[] ski =
+                org.apache.xml.security.keys.content.x509.XMLX509SKI.getSKIBytesFromCert(cert);
+
+            System.out.println();
+            System.out.println("Base64(SKI())=                 \""
+                               + XMLUtils.encodeToString(ski) + "\"");
+            System.out.println("cert.getSerialNumber()=        \""
+                               + cert.getSerialNumber().toString() + "\"");
+            System.out.println("cert.getSubjectX500Principal().getName()= \""
+                               + cert.getSubjectX500Principal().getName() + "\"");
+            System.out.println("cert.getIssuerX500Principal().getName()=  \""
+                               + cert.getIssuerX500Principal().getName() + "\"");
+        }
+    }
 }
diff --git a/src/main/java/org/apache/xml/security/signature/InvalidDigestValueException.java b/src/main/java/org/apache/xml/security/signature/InvalidDigestValueException.java
index b5f2144..ee3caa8 100644
--- a/src/main/java/org/apache/xml/security/signature/InvalidDigestValueException.java
+++ b/src/main/java/org/apache/xml/security/signature/InvalidDigestValueException.java
@@ -54,7 +54,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidDigestValueException(String msgID, Object[] exArgs) {
+    public InvalidDigestValueException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -80,7 +80,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidDigestValueException(Exception originalException, String msgID, Object[] exArgs) {
+    public InvalidDigestValueException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/InvalidSignatureValueException.java b/src/main/java/org/apache/xml/security/signature/InvalidSignatureValueException.java
index bbf8db1..e30c2a5 100644
--- a/src/main/java/org/apache/xml/security/signature/InvalidSignatureValueException.java
+++ b/src/main/java/org/apache/xml/security/signature/InvalidSignatureValueException.java
@@ -53,7 +53,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidSignatureValueException(String msgID, Object[] exArgs) {
+    public InvalidSignatureValueException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -79,7 +79,7 @@
      * @param msgID
      * @param exArgs
      */
-    public InvalidSignatureValueException(Exception originalException, String msgID, Object[] exArgs) {
+    public InvalidSignatureValueException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/Manifest.java b/src/main/java/org/apache/xml/security/signature/Manifest.java
index aaac2d5..ea24e39 100644
--- a/src/main/java/org/apache/xml/security/signature/Manifest.java
+++ b/src/main/java/org/apache/xml/security/signature/Manifest.java
@@ -133,14 +133,14 @@
         int le = this.referencesEl.length;
         if (le == 0) {
             // At least one Reference must be present. Bad.
-            Object[] exArgs = { Constants._TAG_REFERENCE, Constants._TAG_MANIFEST };
+            Object exArgs[] = { Constants._TAG_REFERENCE, Constants._TAG_MANIFEST };
 
             throw new DOMException(DOMException.WRONG_DOCUMENT_ERR,
                                    I18n.translate("xml.WrongContent", exArgs));
         }
 
         if (secureValidation && le > referenceCount) {
-            Object[] exArgs = { le, referenceCount };
+            Object exArgs[] = { le, referenceCount };
 
             throw new XMLSecurityException("signature.tooManyReferences", exArgs);
         }
@@ -316,13 +316,13 @@
                 );
         }
         LOG.debug("verify {} References", referencesEl.length);
-        LOG.debug("I am {} requested to follow nested Manifests", followManifests
-            ? "" : "not");
+        LOG.debug("I am {} requested to follow nested Manifests", (followManifests
+            ? "" : "not"));
         if (referencesEl.length == 0) {
             throw new XMLSecurityException("empty", new Object[]{"References are empty"});
         }
         if (secureValidation && referencesEl.length > referenceCount) {
-            Object[] exArgs = { referencesEl.length, referenceCount };
+            Object exArgs[] = { referencesEl.length, referenceCount };
 
             throw new XMLSecurityException("signature.tooManyReferences", exArgs);
         }
@@ -410,7 +410,7 @@
 
                 verificationResults.add(new VerifiedReference(currentRefVerified, currentRef.getURI(), manifestReferences));
             } catch (ReferenceNotInitializedException ex) {
-                Object[] exArgs = { currentRef.getURI() };
+                Object exArgs[] = { currentRef.getURI() };
 
                 throw new MissingResourceFailureException(
                     ex, currentRef, "signature.Verification.Reference.NoInput", exArgs
@@ -432,7 +432,7 @@
      */
     public boolean getVerificationResult(int index) throws XMLSecurityException {
         if (index < 0 || index > this.getLength() - 1) {
-            Object[] exArgs = { Integer.toString(index), Integer.toString(this.getLength()) };
+            Object exArgs[] = { Integer.toString(index), Integer.toString(this.getLength()) };
             Exception e =
                 new IndexOutOfBoundsException(
                     I18n.translate("signature.Verification.IndexOutOfBounds", exArgs)
diff --git a/src/main/java/org/apache/xml/security/signature/MissingResourceFailureException.java b/src/main/java/org/apache/xml/security/signature/MissingResourceFailureException.java
index 3b213d2..395708b 100644
--- a/src/main/java/org/apache/xml/security/signature/MissingResourceFailureException.java
+++ b/src/main/java/org/apache/xml/security/signature/MissingResourceFailureException.java
@@ -60,14 +60,14 @@
      * @param exArgs
      * @see #getReference
      */
-    public MissingResourceFailureException(Reference reference, String msgID, Object[] exArgs) {
+    public MissingResourceFailureException(Reference reference, String msgID, Object exArgs[]) {
         super(msgID, exArgs);
 
         this.uninitializedReference = reference;
     }
 
     @Deprecated
-    public MissingResourceFailureException(String msgID, Object[] exArgs, Reference reference) {
+    public MissingResourceFailureException(String msgID, Object exArgs[], Reference reference) {
         this(reference, msgID, exArgs);
     }
 
@@ -104,7 +104,7 @@
      * @see #getReference
      */
     public MissingResourceFailureException(
-        Exception originalException, Reference reference, String msgID, Object[] exArgs
+        Exception originalException, Reference reference, String msgID, Object exArgs[]
     ) {
         super(originalException, msgID, exArgs);
 
@@ -113,7 +113,7 @@
 
     @Deprecated
     public MissingResourceFailureException(
-        String msgID, Object[] exArgs, Exception originalException, Reference reference
+        String msgID, Object exArgs[], Exception originalException, Reference reference
     ) {
         this(originalException, reference, msgID, exArgs);
     }
diff --git a/src/main/java/org/apache/xml/security/signature/Reference.java b/src/main/java/org/apache/xml/security/signature/Reference.java
index 4b94d5d..dd752fb 100644
--- a/src/main/java/org/apache/xml/security/signature/Reference.java
+++ b/src/main/java/org/apache/xml/security/signature/Reference.java
@@ -234,7 +234,7 @@
             transforms = new Transforms(el, this.baseURI);
             transforms.setSecureValidation(secureValidation);
             if (secureValidation && transforms.getLength() > MAXIMUM_TRANSFORM_COUNT) {
-                Object[] exArgs = { transforms.getLength(), MAXIMUM_TRANSFORM_COUNT };
+                Object exArgs[] = { transforms.getLength(), MAXIMUM_TRANSFORM_COUNT };
 
                 throw new XMLSecurityException("signature.tooManyTransforms", exArgs);
             }
@@ -273,7 +273,7 @@
         }
 
         if (secureValidation && MessageDigestAlgorithm.ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5.equals(uri)) {
-            Object[] exArgs = { uri };
+            Object exArgs[] = { uri };
 
             throw new XMLSignatureException("signature.signatureAlgorithm", exArgs);
         }
@@ -355,7 +355,11 @@
      * <code>Object</code>
      */
     public boolean typeIsReferenceToObject() {
-        return Reference.OBJECT_URI.equals(this.getType());
+        if (Reference.OBJECT_URI.equals(this.getType())) {
+            return true;
+        }
+
+        return false;
     }
 
     /**
@@ -368,7 +372,11 @@
      * {@link Manifest}
      */
     public boolean typeIsReferenceToManifest() {
-        return Reference.MANIFEST_URI.equals(this.getType());
+        if (Reference.MANIFEST_URI.equals(this.getType())) {
+            return true;
+        }
+
+        return false;
     }
 
     /**
diff --git a/src/main/java/org/apache/xml/security/signature/ReferenceNotInitializedException.java b/src/main/java/org/apache/xml/security/signature/ReferenceNotInitializedException.java
index 60f3356..b361765 100644
--- a/src/main/java/org/apache/xml/security/signature/ReferenceNotInitializedException.java
+++ b/src/main/java/org/apache/xml/security/signature/ReferenceNotInitializedException.java
@@ -57,7 +57,7 @@
      * @param msgID
      * @param exArgs
      */
-    public ReferenceNotInitializedException(String msgID, Object[] exArgs) {
+    public ReferenceNotInitializedException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -83,7 +83,7 @@
      * @param msgID
      * @param exArgs
      */
-    public ReferenceNotInitializedException(Exception originalException, String msgID, Object[] exArgs) {
+    public ReferenceNotInitializedException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/SignedInfo.java b/src/main/java/org/apache/xml/security/signature/SignedInfo.java
index 918f90b..5105824 100644
--- a/src/main/java/org/apache/xml/security/signature/SignedInfo.java
+++ b/src/main/java/org/apache/xml/security/signature/SignedInfo.java
@@ -211,12 +211,16 @@
                 c14nizer.setSecureValidation(secureValidation);
 
                 byte[] c14nizedBytes = c14nizer.canonicalizeSubtree(element);
+                javax.xml.parsers.DocumentBuilder db =
+                    XMLUtils.createDocumentBuilder(false, secureValidation);
                 try (InputStream is = new ByteArrayInputStream(c14nizedBytes)) {
-                    Document newdoc = XMLUtils.read(is, secureValidation);
+                    Document newdoc = db.parse(is);
                     Node imported = element.getOwnerDocument().importNode(
                             newdoc.getDocumentElement(), true);
                     element.getParentNode().replaceChild(imported, element);
                     return (Element) imported;
+                } finally {
+                    XMLUtils.repoolDocumentBuilder(db);
                 }
             } catch (ParserConfigurationException ex) {
                 throw new XMLSecurityException(ex);
@@ -370,8 +374,8 @@
 
     public String getInclusiveNamespaces() {
         String c14nMethodURI = getCanonicalizationMethodURI();
-        if (!("http://www.w3.org/2001/10/xml-exc-c14n#".equals(c14nMethodURI) ||
-            "http://www.w3.org/2001/10/xml-exc-c14n#WithComments".equals(c14nMethodURI))) {
+        if (!(c14nMethodURI.equals("http://www.w3.org/2001/10/xml-exc-c14n#") ||
+            c14nMethodURI.equals("http://www.w3.org/2001/10/xml-exc-c14n#WithComments"))) {
             return null;
         }
 
diff --git a/src/main/java/org/apache/xml/security/signature/XMLSignature.java b/src/main/java/org/apache/xml/security/signature/XMLSignature.java
index ce85ec9..08aac36 100644
--- a/src/main/java/org/apache/xml/security/signature/XMLSignature.java
+++ b/src/main/java/org/apache/xml/security/signature/XMLSignature.java
@@ -397,7 +397,7 @@
 
         // check to see if it is there
         if (signedInfoElem == null) {
-            Object[] exArgs = { Constants._TAG_SIGNEDINFO, Constants._TAG_SIGNATURE };
+            Object exArgs[] = { Constants._TAG_SIGNEDINFO, Constants._TAG_SIGNATURE };
             throw new XMLSignatureException("xml.WrongContent", exArgs);
         }
 
@@ -412,7 +412,7 @@
 
         // check to see if it exists
         if (signatureValueElement == null) {
-            Object[] exArgs = { Constants._TAG_SIGNATUREVALUE, Constants._TAG_SIGNATURE };
+            Object exArgs[] = { Constants._TAG_SIGNATUREVALUE, Constants._TAG_SIGNATURE };
             throw new XMLSignatureException("xml.WrongContent", exArgs);
         }
         Attr signatureValueAttr = signatureValueElement.getAttributeNodeNS(null, "Id");
@@ -696,7 +696,7 @@
             return this.checkSignatureValue(cert.getPublicKey());
         }
 
-        Object[] exArgs = { "Didn't get a certificate" };
+        Object exArgs[] = { "Didn't get a certificate" };
         throw new XMLSignatureException("empty", exArgs);
     }
 
@@ -714,7 +714,7 @@
         //COMMENT: pk suggests it can only be a public key?
         //check to see if the key is not null
         if (pk == null) {
-            Object[] exArgs = { "Didn't get a key" };
+            Object exArgs[] = { "Didn't get a key" };
             throw new XMLSignatureException("empty", exArgs);
         }
         // all references inside the signedinfo need to be dereferenced and
@@ -732,7 +732,7 @@
             LOG.debug("jceSigProvider = {}", sa.getJCEProviderName());
             LOG.debug("PublicKey = {}", pk);
 
-            byte[] sigBytes = null;
+            byte sigBytes[] = null;
             try (SignerOutputStream so = new SignerOutputStream(sa);
                 OutputStream bos = new UnsyncBufferedOutputStream(so)) {
 
diff --git a/src/main/java/org/apache/xml/security/signature/XMLSignatureException.java b/src/main/java/org/apache/xml/security/signature/XMLSignatureException.java
index eef5627..774720d 100644
--- a/src/main/java/org/apache/xml/security/signature/XMLSignatureException.java
+++ b/src/main/java/org/apache/xml/security/signature/XMLSignatureException.java
@@ -59,7 +59,7 @@
      * @param msgID
      * @param exArgs
      */
-    public XMLSignatureException(String msgID, Object[] exArgs) {
+    public XMLSignatureException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -85,7 +85,7 @@
      * @param msgID
      * @param exArgs
      */
-    public XMLSignatureException(Exception originalException, String msgID, Object[] exArgs) {
+    public XMLSignatureException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/XMLSignatureInput.java b/src/main/java/org/apache/xml/security/signature/XMLSignatureInput.java
index e8f82fa..c6f56bf 100644
--- a/src/main/java/org/apache/xml/security/signature/XMLSignatureInput.java
+++ b/src/main/java/org/apache/xml/security/signature/XMLSignatureInput.java
@@ -29,6 +29,7 @@
 import java.util.List;
 import java.util.Set;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.xml.security.c14n.CanonicalizationException;
@@ -225,12 +226,12 @@
             if (circumvent) {
                 XMLUtils.circumventBug2650(XMLUtils.getOwnerDocument(subNode));
             }
-            inputNodeSet = new LinkedHashSet<>();
+            inputNodeSet = new LinkedHashSet<Node>();
             XMLUtils.getSet(subNode, inputNodeSet, excludeNode, excludeComments);
             return inputNodeSet;
         } else if (isOctetStream()) {
             convertToNodes();
-            Set<Node> result = new LinkedHashSet<>();
+            Set<Node> result = new LinkedHashSet<Node>();
             XMLUtils.getSet(subNode, result, null, false);
             return result;
         }
@@ -569,9 +570,12 @@
 
     void convertToNodes() throws CanonicalizationException,
         ParserConfigurationException, IOException, SAXException {
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false, secureValidation);
         // select all nodes, also the comments.
         try {
-            Document doc = XMLUtils.read(this.getOctetStream(), secureValidation);
+            db.setErrorHandler(new org.apache.xml.security.utils.IgnoreAllErrorHandler());
+
+            Document doc = db.parse(this.getOctetStream());
             this.subNode = doc;
         } catch (SAXException ex) {
             byte[] result = null;
@@ -585,10 +589,11 @@
                 result = baos.toByteArray();
             }
             try (InputStream is = new ByteArrayInputStream(result)) {
-                Document document = XMLUtils.read(is, secureValidation);
+                Document document = db.parse(is);
                 this.subNode = document.getDocumentElement().getFirstChild().getFirstChild();
             }
         } finally {
+            XMLUtils.repoolDocumentBuilder(db);
             if (this.inputOctetStreamProxy != null) {
                 this.inputOctetStreamProxy.close();
             }
diff --git a/src/main/java/org/apache/xml/security/signature/XMLSignatureInputDebugger.java b/src/main/java/org/apache/xml/security/signature/XMLSignatureInputDebugger.java
index 6cc0b0d..cf47d76 100644
--- a/src/main/java/org/apache/xml/security/signature/XMLSignatureInputDebugger.java
+++ b/src/main/java/org/apache/xml/security/signature/XMLSignatureInputDebugger.java
@@ -291,7 +291,7 @@
             }
 
             Arrays.sort(attrs2, ATTR_COMPARE);
-            Object[] attrs3 = attrs2;
+            Object attrs3[] = attrs2;
 
             for (int i = 0; i < attrsLength; i++) {
                 Attr a = (Attr) attrs3[i];
@@ -512,10 +512,15 @@
             for (int i = 0; i < length; i++) {
                 char c = data.charAt(i);
 
-                if (c == 0x0D) {
+                switch (c) {
+
+                case 0x0D:
                     this.writer.write("&amp;#xD;");
-                } else {
+                    break;
+
+                default:
                     this.writer.write(c);
+                    break;
                 }
             }
         }
diff --git a/src/main/java/org/apache/xml/security/stax/config/ConfigurationProperties.java b/src/main/java/org/apache/xml/security/stax/config/ConfigurationProperties.java
index 78f1f3c..fc3781b 100644
--- a/src/main/java/org/apache/xml/security/stax/config/ConfigurationProperties.java
+++ b/src/main/java/org/apache/xml/security/stax/config/ConfigurationProperties.java
@@ -28,7 +28,7 @@
  * Configuration Properties
  *
  */
-public final class ConfigurationProperties {
+public class ConfigurationProperties {
 
     private static Properties properties;
     private static Class<?> callingClass;
diff --git a/src/main/java/org/apache/xml/security/stax/config/Init.java b/src/main/java/org/apache/xml/security/stax/config/Init.java
index 0da7116..cacf54d 100644
--- a/src/main/java/org/apache/xml/security/stax/config/Init.java
+++ b/src/main/java/org/apache/xml/security/stax/config/Init.java
@@ -54,15 +54,12 @@
                 JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
                 final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
                 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-                schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
                 Schema schema = schemaFactory.newSchema(
                         ClassLoaderUtils.getResource("schemas/security-config.xsd", Init.class));
                 unmarshaller.setSchema(schema);
                 final UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
 
                 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
-                saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
-                saxParserFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
                 saxParserFactory.setXIncludeAware(false);
                 saxParserFactory.setNamespaceAware(true);
                 SAXParser saxParser = saxParserFactory.newSAXParser();
diff --git a/src/main/java/org/apache/xml/security/stax/config/JCEAlgorithmMapper.java b/src/main/java/org/apache/xml/security/stax/config/JCEAlgorithmMapper.java
index febe3d1..d6d6fd6 100644
--- a/src/main/java/org/apache/xml/security/stax/config/JCEAlgorithmMapper.java
+++ b/src/main/java/org/apache/xml/security/stax/config/JCEAlgorithmMapper.java
@@ -27,7 +27,7 @@
 /**
  * Mapping between JCE id and xmlsec uri's for algorithms
  */
-public final class JCEAlgorithmMapper extends JCEMapper {
+public class JCEAlgorithmMapper extends JCEMapper {
 
     private JCEAlgorithmMapper() {
     }
diff --git a/src/main/java/org/apache/xml/security/stax/config/ResourceResolverMapper.java b/src/main/java/org/apache/xml/security/stax/config/ResourceResolverMapper.java
index 275894d..93d63e6 100644
--- a/src/main/java/org/apache/xml/security/stax/config/ResourceResolverMapper.java
+++ b/src/main/java/org/apache/xml/security/stax/config/ResourceResolverMapper.java
@@ -30,7 +30,7 @@
 
 /**
  */
-public final class ResourceResolverMapper {
+public class ResourceResolverMapper {
 
     private static List<ResourceResolverLookup> resourceResolvers;
 
diff --git a/src/main/java/org/apache/xml/security/stax/config/SecurityHeaderHandlerMapper.java b/src/main/java/org/apache/xml/security/stax/config/SecurityHeaderHandlerMapper.java
index e46b969..d9b2062 100644
--- a/src/main/java/org/apache/xml/security/stax/config/SecurityHeaderHandlerMapper.java
+++ b/src/main/java/org/apache/xml/security/stax/config/SecurityHeaderHandlerMapper.java
@@ -32,7 +32,7 @@
  * Security-header handler mapper
  *
  */
-public final class SecurityHeaderHandlerMapper {
+public class SecurityHeaderHandlerMapper {
 
     private static Map<QName, Class<?>> handlerClassMap;
 
diff --git a/src/main/java/org/apache/xml/security/stax/config/TransformerAlgorithmMapper.java b/src/main/java/org/apache/xml/security/stax/config/TransformerAlgorithmMapper.java
index f481096..474a911 100644
--- a/src/main/java/org/apache/xml/security/stax/config/TransformerAlgorithmMapper.java
+++ b/src/main/java/org/apache/xml/security/stax/config/TransformerAlgorithmMapper.java
@@ -32,7 +32,7 @@
  * Mapping between JCE id and xmlsec uri's for algorithms
  *
  */
-public final class TransformerAlgorithmMapper {
+public class TransformerAlgorithmMapper {
 
     private static Map<String, Class<?>> algorithmsClassMapInOut;
     private static Map<String, Class<?>> algorithmsClassMapIn;
@@ -68,10 +68,13 @@
     public static Class<?> getTransformerClass(String algoURI, XMLSecurityConstants.DIRECTION direction) throws XMLSecurityException {
         Class<?> clazz = null;
 
-        if (XMLSecurityConstants.DIRECTION.IN == direction) {
-            clazz = algorithmsClassMapIn.get(algoURI);
-        } else if (XMLSecurityConstants.DIRECTION.OUT == direction) {
-            clazz = algorithmsClassMapOut.get(algoURI);
+        switch (direction) {
+            case IN:
+                clazz = algorithmsClassMapIn.get(algoURI);
+                break;
+            case OUT:
+                clazz = algorithmsClassMapOut.get(algoURI);
+                break;
         }
 
         if (clazz == null) {
diff --git a/src/main/java/org/apache/xml/security/stax/ext/AbstractBufferingOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/ext/AbstractBufferingOutputProcessor.java
index 21e446e..e823169 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/AbstractBufferingOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/AbstractBufferingOutputProcessor.java
@@ -30,7 +30,7 @@
  */
 public abstract class AbstractBufferingOutputProcessor extends AbstractOutputProcessor {
 
-    private final ArrayDeque<XMLSecEvent> xmlSecEventBuffer = new ArrayDeque<>(100);
+    private final ArrayDeque<XMLSecEvent> xmlSecEventBuffer = new ArrayDeque<XMLSecEvent>(100);
 
     protected AbstractBufferingOutputProcessor() throws XMLSecurityException {
         super();
diff --git a/src/main/java/org/apache/xml/security/stax/ext/AbstractOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/ext/AbstractOutputProcessor.java
index dd78de8..f71f1a4 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/AbstractOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/AbstractOutputProcessor.java
@@ -285,10 +285,13 @@
         createStartElementAndOutputAsEvent(outputProcessorChain, elementName, namespaces, attributes);
         Node childNode = element.getFirstChild();
         while (childNode != null) {
-            if (Node.ELEMENT_NODE == childNode.getNodeType()) {
-                outputDOMElement((Element) childNode, outputProcessorChain);
-            } else if (Node.TEXT_NODE == childNode.getNodeType()) {
-                createCharactersAndOutputAsEvent(outputProcessorChain, ((Text) childNode).getData());
+            switch (childNode.getNodeType()) {
+                case Node.ELEMENT_NODE:
+                    outputDOMElement((Element) childNode, outputProcessorChain);
+                    break;
+                case Node.TEXT_NODE:
+                    createCharactersAndOutputAsEvent(outputProcessorChain, ((Text) childNode).getData());
+                    break;
             }
             childNode = childNode.getNextSibling();
         }
diff --git a/src/main/java/org/apache/xml/security/stax/ext/OutboundXMLSec.java b/src/main/java/org/apache/xml/security/stax/ext/OutboundXMLSec.java
index a89bf71..d1aeddb 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/OutboundXMLSec.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/OutboundXMLSec.java
@@ -115,7 +115,8 @@
 
                 configureSignatureKeys(outboundSecurityContext);
                 List<SecurePart> signatureParts = securityProperties.getSignatureSecureParts();
-                for (SecurePart securePart : signatureParts) {
+                for (int j = 0; j < signatureParts.size(); j++) {
+                    SecurePart securePart = signatureParts.get(j);
                     if (securePart.getIdToSign() == null && securePart.getName() != null) {
                         outputProcessorChain.getSecurityContext().putAsMap(
                                 XMLSecurityConstants.SIGNATURE_PARTS,
@@ -139,7 +140,8 @@
 
                 configureEncryptionKeys(outboundSecurityContext);
                 List<SecurePart> encryptionParts = securityProperties.getEncryptionSecureParts();
-                for (SecurePart securePart : encryptionParts) {
+                for (int j = 0; j < encryptionParts.size(); j++) {
+                    SecurePart securePart = encryptionParts.get(j);
                     if (securePart.getIdToSign() == null && securePart.getName() != null) {
                         outputProcessorChain.getSecurityContext().putAsMap(
                                 XMLSecurityConstants.ENCRYPTION_PARTS,
diff --git a/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityProperties.java b/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityProperties.java
index eec0e7f..679d4aa 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityProperties.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityProperties.java
@@ -38,7 +38,7 @@
     private boolean skipDocumentEvents = false;
     private boolean disableSchemaValidation = false;
 
-    private List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+    private List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
 
     private X509Certificate encryptionUseThisCertificate;
     private String encryptionSymAlgorithm;
@@ -46,7 +46,7 @@
     private String encryptionKeyTransportDigestAlgorithm;
     private String encryptionKeyTransportMGFAlgorithm;
     private byte[] encryptionKeyTransportOAEPParams;
-    private final List<SecurePart> encryptionParts = new LinkedList<>();
+    private final List<SecurePart> encryptionParts = new LinkedList<SecurePart>();
     private Key encryptionKey;
     private Key encryptionTransportKey;
     private SecurityTokenConstants.KeyIdentifier encryptionKeyIdentifier;
@@ -54,7 +54,7 @@
 
     private Key decryptionKey;
 
-    private final List<SecurePart> signatureParts = new LinkedList<>();
+    private final List<SecurePart> signatureParts = new LinkedList<SecurePart>();
     private String signatureAlgorithm;
     private String signatureDigestAlgorithm;
     private String signatureCanonicalizationAlgorithm;
@@ -409,7 +409,7 @@
 
     public void addAction(XMLSecurityConstants.Action action) {
         if (actions == null) {
-            actions = new ArrayList<>();
+            actions = new ArrayList<XMLSecurityConstants.Action>();
         }
         actions.add(action);
     }
diff --git a/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityUtils.java b/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityUtils.java
index 8f7591e..8c31311 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityUtils.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/XMLSecurityUtils.java
@@ -18,22 +18,24 @@
  */
 package org.apache.xml.security.stax.ext;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.security.PublicKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.DSAPublicKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAPublicKey;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
+import org.apache.xml.security.algorithms.JCEMapper;
+import org.apache.xml.security.algorithms.implementations.ECDSAUtils;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.keys.content.x509.XMLX509SKI;
+import org.apache.xml.security.stax.config.TransformerAlgorithmMapper;
+import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.impl.util.ConcreteLSInput;
+import org.apache.xml.security.stax.securityEvent.*;
+import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.utils.ClassLoaderUtils;
+import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.SAXException;
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
@@ -46,30 +48,17 @@
 import javax.xml.validation.Schema;
 import javax.xml.validation.SchemaFactory;
 
-import org.w3c.dom.ls.LSInput;
-import org.w3c.dom.ls.LSResourceResolver;
-import org.xml.sax.SAXException;
-
-import org.apache.xml.security.algorithms.JCEMapper;
-import org.apache.xml.security.algorithms.implementations.ECDSAUtils;
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.keys.content.x509.XMLX509SKI;
-import org.apache.xml.security.stax.config.TransformerAlgorithmMapper;
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.impl.util.ConcreteLSInput;
-import org.apache.xml.security.stax.securityEvent.DefaultTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.EncryptedKeyTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.KeyNameTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.KeyValueTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.TokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.X509TokenSecurityEvent;
-import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.utils.ClassLoaderUtils;
-import org.apache.xml.security.utils.XMLUtils;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigInteger;
+import java.security.PublicKey;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.*;
 
 /**
  */
@@ -509,7 +498,6 @@
 
     public static Schema loadXMLSecuritySchemas() throws SAXException {
         SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-        schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
         schemaFactory.setResourceResolver(new LSResourceResolver() {
             @Override
             public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
diff --git a/src/main/java/org/apache/xml/security/stax/ext/stax/XMLSecEventFactory.java b/src/main/java/org/apache/xml/security/stax/ext/stax/XMLSecEventFactory.java
index d91d060..ff3f84d 100644
--- a/src/main/java/org/apache/xml/security/stax/ext/stax/XMLSecEventFactory.java
+++ b/src/main/java/org/apache/xml/security/stax/ext/stax/XMLSecEventFactory.java
@@ -18,33 +18,21 @@
  */
 package org.apache.xml.security.stax.ext.stax;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
+import org.apache.xml.security.stax.impl.stax.*;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.events.EntityDeclaration;
-
-import org.apache.xml.security.stax.impl.stax.XMLSecAttributeImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecCharactersImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecCommentImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecDTDImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEndDocumentImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEndElementImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEntityDeclarationImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEntityReferenceImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecNamespaceImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecProcessingInstructionImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecStartDocumentImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecStartElementImpl;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 
 /**
  */
-public final class XMLSecEventFactory {
+public class XMLSecEventFactory {
 
     private XMLSecEventFactory() {
     }
diff --git a/src/main/java/org/apache/xml/security/stax/impl/DocumentContextImpl.java b/src/main/java/org/apache/xml/security/stax/impl/DocumentContextImpl.java
index 319cce6..adcd969 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/DocumentContextImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/DocumentContextImpl.java
@@ -31,7 +31,7 @@
 
     private String encoding;
     private String baseURI;
-    private final Map<Integer, XMLSecurityConstants.ContentType> contentTypeMap = new TreeMap<>();
+    private final Map<Integer, XMLSecurityConstants.ContentType> contentTypeMap = new TreeMap<Integer, XMLSecurityConstants.ContentType>();
     private final Map<Object, Integer> processorToIndexMap = new HashMap<>();
 
     @Override
@@ -101,8 +101,8 @@
     }
 
     @Override
-    public DocumentContextImpl clone() throws CloneNotSupportedException {
-        DocumentContextImpl documentContext = (DocumentContextImpl)super.clone();
+    protected DocumentContextImpl clone() throws CloneNotSupportedException {
+        DocumentContextImpl documentContext = new DocumentContextImpl();
         documentContext.setEncoding(this.encoding);
         documentContext.setBaseURI(this.baseURI);
         documentContext.setContentTypeMap(getContentTypeMap());
diff --git a/src/main/java/org/apache/xml/security/stax/impl/InputProcessorChainImpl.java b/src/main/java/org/apache/xml/security/stax/impl/InputProcessorChainImpl.java
index 9f5b8a7..0e9ba67 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/InputProcessorChainImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/InputProcessorChainImpl.java
@@ -18,20 +18,15 @@
  */
 package org.apache.xml.security.stax.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.DocumentContext;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessor;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+
+import javax.xml.stream.XMLStreamException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Implementation of a InputProcessorChain
diff --git a/src/main/java/org/apache/xml/security/stax/impl/OutputProcessorChainImpl.java b/src/main/java/org/apache/xml/security/stax/impl/OutputProcessorChainImpl.java
index 275c350..fb83ebe 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/OutputProcessorChainImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/OutputProcessorChainImpl.java
@@ -18,22 +18,17 @@
  */
 package org.apache.xml.security.stax.impl;
 
-import java.util.ArrayList;
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
 
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.DocumentContext;
-import org.apache.xml.security.stax.ext.OutboundSecurityContext;
-import org.apache.xml.security.stax.ext.OutputProcessor;
-import org.apache.xml.security.stax.ext.OutputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Implementation of a OutputProcessorChain
diff --git a/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityEventWriter.java b/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityEventWriter.java
index 346a646..f0089cd 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityEventWriter.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityEventWriter.java
@@ -18,29 +18,13 @@
  */
 package org.apache.xml.security.stax.impl;
 
-import java.util.List;
+import org.apache.xml.security.stax.ext.stax.*;
 
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.namespace.QName;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.stream.events.Attribute;
-import javax.xml.stream.events.Comment;
-import javax.xml.stream.events.DTD;
-import javax.xml.stream.events.EntityReference;
-import javax.xml.stream.events.Namespace;
-import javax.xml.stream.events.ProcessingInstruction;
-import javax.xml.stream.events.StartDocument;
-import javax.xml.stream.events.XMLEvent;
-
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecCharacters;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import javax.xml.stream.*;
+import javax.xml.stream.events.*;
+import java.util.List;
 
 /**
  */
diff --git a/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityStreamWriter.java b/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityStreamWriter.java
index bd0fda2..9c4f9d8 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityStreamWriter.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/XMLSecurityStreamWriter.java
@@ -486,7 +486,7 @@
         private NamespaceContext parentNamespaceContext;
         private List<String> prefixNsList = Collections.emptyList();
 
-        NSContext(NamespaceContext parentNamespaceContext) {
+        private NSContext(NamespaceContext parentNamespaceContext) {
             this.parentNamespaceContext = parentNamespaceContext;
         }
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/algorithms/DSAUtils.java b/src/main/java/org/apache/xml/security/stax/impl/algorithms/DSAUtils.java
index cf88666..11533db 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/algorithms/DSAUtils.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/algorithms/DSAUtils.java
@@ -33,7 +33,7 @@
      * @throws java.io.IOException
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      */
-    public static byte[] convertASN1toXMLDSIG(byte[] asn1Bytes) throws IOException {
+    public static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
         return org.apache.xml.security.algorithms.implementations.ECDSAUtils.convertASN1toXMLDSIG(asn1Bytes);
     }
 
@@ -47,7 +47,7 @@
      * @throws IOException
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      */
-    public static byte[] convertXMLDSIGtoASN1(byte[] xmldsigBytes) throws IOException {
+    public static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
         return org.apache.xml.security.algorithms.implementations.ECDSAUtils.convertXMLDSIGtoASN1(xmldsigBytes);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/xml/security/stax/impl/algorithms/ECDSAUtils.java b/src/main/java/org/apache/xml/security/stax/impl/algorithms/ECDSAUtils.java
index dcc0f6b..a251369 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/algorithms/ECDSAUtils.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/algorithms/ECDSAUtils.java
@@ -41,7 +41,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertASN1toXMLDSIG(byte[] asn1Bytes) throws IOException {
+    public static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
         return org.apache.xml.security.algorithms.implementations.ECDSAUtils.convertASN1toXMLDSIG(asn1Bytes);
     }
 
@@ -57,7 +57,7 @@
      * @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
      * @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
      */
-    public static byte[] convertXMLDSIGtoASN1(byte[] xmldsigBytes) throws IOException {
+    public static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
         return org.apache.xml.security.algorithms.implementations.ECDSAUtils.convertXMLDSIGtoASN1(xmldsigBytes);
     }
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithm.java b/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithm.java
index bb975bc..aeab322 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithm.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithm.java
@@ -32,7 +32,7 @@
 
     void engineUpdate(byte input) throws XMLSecurityException;
 
-    void engineUpdate(byte[] buf, int offset, int len) throws XMLSecurityException;
+    void engineUpdate(byte buf[], int offset, int len) throws XMLSecurityException;
 
     void engineInitSign(Key signingKey) throws XMLSecurityException;
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithmFactory.java b/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithmFactory.java
index a3570d3..a2fce72 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithmFactory.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/algorithms/SignatureAlgorithmFactory.java
@@ -26,7 +26,7 @@
 
 /**
  */
-public final class SignatureAlgorithmFactory {
+public class SignatureAlgorithmFactory {
 
     private static SignatureAlgorithmFactory instance;
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractDecryptInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractDecryptInputProcessor.java
index d74608e..7deca4f 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractDecryptInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractDecryptInputProcessor.java
@@ -18,33 +18,32 @@
  */
 package org.apache.xml.security.stax.impl.processor.input;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import org.apache.commons.codec.binary.Base64OutputStream;
+import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
+import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.xml.security.binding.xmldsig.KeyInfoType;
+import org.apache.xml.security.binding.xmlenc.EncryptedDataType;
+import org.apache.xml.security.binding.xmlenc.EncryptedKeyType;
+import org.apache.xml.security.binding.xmlenc.ReferenceList;
+import org.apache.xml.security.binding.xmlenc.ReferenceType;
+import org.apache.xml.security.binding.xop.Include;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.ConfigurationProperties;
+import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
+import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.impl.XMLSecurityEventReader;
+import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
+import org.apache.xml.security.stax.impl.util.*;
 
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.CipherOutputStream;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.security.auth.DestroyFailedException;
-import javax.security.auth.Destroyable;
+import javax.crypto.*;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
@@ -55,41 +54,13 @@
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.events.Attribute;
 
-import org.apache.commons.codec.binary.Base64OutputStream;
-import org.apache.xml.security.binding.xmldsig.KeyInfoType;
-import org.apache.xml.security.binding.xmlenc.EncryptedDataType;
-import org.apache.xml.security.binding.xmlenc.EncryptedKeyType;
-import org.apache.xml.security.binding.xmlenc.ReferenceList;
-import org.apache.xml.security.binding.xmlenc.ReferenceType;
-import org.apache.xml.security.binding.xop.Include;
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.ConfigurationProperties;
-import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
-import org.apache.xml.security.stax.ext.AbstractInputProcessor;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.UncheckedXMLSecurityException;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.impl.XMLSecurityEventReader;
-import org.apache.xml.security.stax.impl.util.FullyBufferedOutputStream;
-import org.apache.xml.security.stax.impl.util.IDGenerator;
-import org.apache.xml.security.stax.impl.util.IVSplittingOutputStream;
-import org.apache.xml.security.stax.impl.util.MultiInputStream;
-import org.apache.xml.security.stax.impl.util.ReplaceableOuputStream;
-import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
-import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
-import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.util.*;
 
 /**
  * Processor for decryption of EncryptedData XML structures
@@ -111,7 +82,7 @@
     private final String uuid = IDGenerator.generateID(null);
     private final QName wrapperElementName = new QName("http://dummy", "dummy", uuid);
 
-    private final ArrayDeque<XMLSecEvent> tmpXmlEventList = new ArrayDeque<>();
+    private final ArrayDeque<XMLSecEvent> tmpXmlEventList = new ArrayDeque<XMLSecEvent>();
 
     public AbstractDecryptInputProcessor(XMLSecurityProperties securityProperties) throws XMLSecurityException {
         super(securityProperties);
@@ -286,7 +257,7 @@
                 if (nextEvent.isStartElement() && nextEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_XOP_INCLUDE)) {
                     try {
                         // Unmarshal the XOP Include Element
-                        Deque<XMLSecEvent> xmlSecEvents = new ArrayDeque<>();
+                        Deque<XMLSecEvent> xmlSecEvents = new ArrayDeque<XMLSecEvent>();
                         xmlSecEvents.push(nextEvent);
                         xmlSecEvents.push(XMLSecEventFactory.createXmlSecEndElement(XMLSecurityConstants.TAG_XOP_INCLUDE));
 
@@ -378,7 +349,8 @@
         stringBuilder.append(wrapperElementName.getPrefix());
         stringBuilder.append(':');
         stringBuilder.append(wrapperElementName.getLocalPart());
-        stringBuilder.append(" xmlns:");
+        stringBuilder.append(' ');
+        stringBuilder.append("xmlns:");
         stringBuilder.append(wrapperElementName.getPrefix());
         stringBuilder.append("=\"");
         stringBuilder.append(wrapperElementName.getNamespaceURI());
@@ -400,13 +372,13 @@
                 if (prefix == null || prefix.isEmpty()) {
                     stringBuilder.append("xmlns=\"");
                     stringBuilder.append(uri);
-                    stringBuilder.append('\"');
+                    stringBuilder.append("\"");
                 } else {
                     stringBuilder.append("xmlns:");
                     stringBuilder.append(prefix);
                     stringBuilder.append("=\"");
                     stringBuilder.append(uri);
-                    stringBuilder.append('\"');
+                    stringBuilder.append("\"");
                 }
             }
         }
@@ -495,7 +467,7 @@
             boolean isSecurityHeaderEvent, XMLSecEvent xmlSecEvent, InputProcessorChain subInputProcessorChain)
             throws XMLStreamException, XMLSecurityException {
 
-        Deque<XMLSecEvent> xmlSecEvents = new ArrayDeque<>();
+        Deque<XMLSecEvent> xmlSecEvents = new ArrayDeque<XMLSecEvent>();
         xmlSecEvents.push(xmlSecEvent);
         XMLSecEvent encryptedDataXMLSecEvent;
         int count = 0;
@@ -680,72 +652,75 @@
             XMLSecEvent xmlSecEvent = XMLSecEventFactory.allocate(xmlStreamReader, parentXmlSecStartElement);
             //here we request the next XMLEvent from the decryption thread
             //instead from the processor-chain as we normally would do
-            if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-                currentXMLStructureDepth++;
-                if (currentXMLStructureDepth > maximumAllowedXMLStructureDepth) {
-                    throw new XMLSecurityException(
-                                                   "secureProcessing.MaximumAllowedXMLStructureDepth",
-                                                   new Object[] {maximumAllowedXMLStructureDepth}
+            switch (xmlSecEvent.getEventType()) {
+                case XMLStreamConstants.START_ELEMENT:
+                    currentXMLStructureDepth++;
+                    if (currentXMLStructureDepth > maximumAllowedXMLStructureDepth) {
+                        throw new XMLSecurityException(
+                                "secureProcessing.MaximumAllowedXMLStructureDepth",
+                                new Object[] {maximumAllowedXMLStructureDepth}
                         );
-                }
-
-                parentXmlSecStartElement = xmlSecEvent.asStartElement();
-                if (!rootElementProcessed) {
-                    handleEncryptedElement(inputProcessorChain, parentXmlSecStartElement, this.inboundSecurityToken, encryptedDataType);
-                    rootElementProcessed = true;
-                }
-            } else if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-                currentXMLStructureDepth--;
-
-                if (parentXmlSecStartElement != null) {
-                    parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
-                }
-
-                if (xmlSecEvent.asEndElement().getName().equals(wrapperElementName)) {
-                    InputProcessorChain subInputProcessorChain = inputProcessorChain.createSubChain(this);
-
-                    //skip EncryptedHeader Element when we processed it.
-                    QName endElement;
-                    if (encryptedHeader) {
-                        endElement = XMLSecurityConstants.TAG_wsse11_EncryptedHeader;
-                    } else {
-                        endElement = XMLSecurityConstants.TAG_xenc_EncryptedData;
                     }
 
-                    //read and discard XMLEvents until the EncryptedData structure
-                    XMLSecEvent endEvent;
-                    do {
-                        subInputProcessorChain.reset();
-                        if (headerEvent) {
-                            endEvent = subInputProcessorChain.processHeaderEvent();
+                    parentXmlSecStartElement = xmlSecEvent.asStartElement();
+                    if (!rootElementProcessed) {
+                        handleEncryptedElement(inputProcessorChain, parentXmlSecStartElement, this.inboundSecurityToken, encryptedDataType);
+                        rootElementProcessed = true;
+                    }
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    currentXMLStructureDepth--;
+
+                    if (parentXmlSecStartElement != null) {
+                        parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
+                    }
+
+                    if (xmlSecEvent.asEndElement().getName().equals(wrapperElementName)) {
+                        InputProcessorChain subInputProcessorChain = inputProcessorChain.createSubChain(this);
+
+                        //skip EncryptedHeader Element when we processed it.
+                        QName endElement;
+                        if (encryptedHeader) {
+                            endElement = XMLSecurityConstants.TAG_wsse11_EncryptedHeader;
                         } else {
-                            endEvent = subInputProcessorChain.processEvent();
+                            endElement = XMLSecurityConstants.TAG_xenc_EncryptedData;
                         }
-                    }
-                    while (!(endEvent.getEventType() == XMLStreamConstants.END_ELEMENT
-                        && endEvent.asEndElement().getName().equals(endElement)));
 
-                    inputProcessorChain.getDocumentContext().unsetIsInEncryptedContent(this);
-
-                    //...fetch the next (unencrypted) event
-                    if (headerEvent) {
-                        xmlSecEvent = inputProcessorChain.processHeaderEvent();
-                    } else {
-                        xmlSecEvent = inputProcessorChain.processEvent();
-                    }
-
-                    if (decryptionThread != null) {
-                        //wait until the decryption thread dies...
-                        try {
-                            decryptionThread.join();
-                        } catch (InterruptedException e) {
-                            throw new XMLStreamException(e);
+                        //read and discard XMLEvents until the EncryptedData structure
+                        XMLSecEvent endEvent;
+                        do {
+                            subInputProcessorChain.reset();
+                            if (headerEvent) {
+                                endEvent = subInputProcessorChain.processHeaderEvent();
+                            } else {
+                                endEvent = subInputProcessorChain.processEvent();
+                            }
                         }
-                        //...and test again for an exception in the decryption thread.
-                        testAndThrowUncaughtException();
+                        while (!(endEvent.getEventType() == XMLStreamConstants.END_ELEMENT
+                                && endEvent.asEndElement().getName().equals(endElement)));
+
+                        inputProcessorChain.getDocumentContext().unsetIsInEncryptedContent(this);
+
+                        //...fetch the next (unencrypted) event
+                        if (headerEvent) {
+                            xmlSecEvent = inputProcessorChain.processHeaderEvent();
+                        } else {
+                            xmlSecEvent = inputProcessorChain.processEvent();
+                        }
+
+                        if (decryptionThread != null) {
+                            //wait until the decryption thread dies...
+                            try {
+                                decryptionThread.join();
+                            } catch (InterruptedException e) {
+                                throw new XMLStreamException(e);
+                            }
+                            //...and test again for an exception in the decryption thread.
+                            testAndThrowUncaughtException();
+                        }
+                        inputProcessorChain.removeProcessor(this);
                     }
-                    inputProcessorChain.removeProcessor(this);
-                }
+                    break;
             }
             xmlStreamReader.next();
             return xmlSecEvent;
@@ -887,16 +862,6 @@
 
                 //close to get Cipher.doFinal() called
                 outputStreamWriter.close();
-
-                // Clean the secret key from memory now that we're done with it
-                if (secretKey instanceof Destroyable) {
-                    try {
-                        ((Destroyable)secretKey).destroy();
-                    } catch (DestroyFailedException e) {
-                        LOG.debug("Error destroying key: {}", e.getMessage());
-                    }
-                }
-
                 LOG.debug("Decryption thread finished");
 
             } catch (Exception e) {
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureInputHandler.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureInputHandler.java
index a679ed3..1454961 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureInputHandler.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureInputHandler.java
@@ -23,29 +23,18 @@
 import org.apache.xml.security.binding.xmldsig.SignatureType;
 import org.apache.xml.security.binding.xmldsig.SignedInfoType;
 import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
 import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
-import org.apache.xml.security.stax.impl.util.IDGenerator;
-import org.apache.xml.security.stax.impl.util.SignerOutputStream;
 import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
 import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
 import org.apache.xml.security.utils.UnsyncByteArrayOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.xml.security.stax.ext.AbstractInputSecurityHeaderHandler;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.Transformer;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
 import org.apache.xml.security.stax.impl.algorithms.SignatureAlgorithm;
 import org.apache.xml.security.stax.impl.algorithms.SignatureAlgorithmFactory;
+import org.apache.xml.security.stax.impl.util.*;
 
-import javax.security.auth.DestroyFailedException;
-import javax.security.auth.Destroyable;
 import javax.xml.bind.JAXBElement;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
@@ -63,8 +52,6 @@
  */
 public abstract class AbstractSignatureInputHandler extends AbstractInputSecurityHeaderHandler {
 
-    private static final transient Logger LOG = LoggerFactory.getLogger(AbstractSignatureInputHandler.class);
-
     @Override
     public void handle(final InputProcessorChain inputProcessorChain, final XMLSecurityProperties securityProperties,
                        Deque<XMLSecEvent> eventQueue, Integer index) throws XMLSecurityException {
@@ -127,19 +114,25 @@
             loop:
             while (iterator.hasNext()) {
                 XMLSecEvent xmlSecEvent = iterator.next();
-                if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()
-                    && xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
-                    signatureVerifier.processEvent(xmlSecEvent);
-                    break loop;
+                switch (xmlSecEvent.getEventType()) {
+                    case XMLStreamConstants.START_ELEMENT:
+                        if (xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
+                            signatureVerifier.processEvent(xmlSecEvent);
+                            break loop;
+                        }
+                        break;
                 }
             }
             loop:
             while (iterator.hasNext()) {
                 XMLSecEvent xmlSecEvent = iterator.next();
                 signatureVerifier.processEvent(xmlSecEvent);
-                if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()
-                    && xmlSecEvent.asEndElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
-                    break loop;
+                switch (xmlSecEvent.getEventType()) {
+                    case XMLStreamConstants.END_ELEMENT:
+                        if (xmlSecEvent.asEndElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
+                            break loop;
+                        }
+                        break;
                 }
             }
         } catch (XMLStreamException e) {
@@ -153,7 +146,7 @@
                                                    SignatureType signatureType, Deque<XMLSecEvent> eventDeque, int index
     ) throws XMLSecurityException {
 
-        Deque<XMLSecEvent> signedInfoDeque = new ArrayDeque<>();
+        Deque<XMLSecEvent> signedInfoDeque = new ArrayDeque<XMLSecEvent>();
 
         try (UnsyncByteArrayOutputStream unsynchronizedByteArrayOutputStream = new UnsyncByteArrayOutputStream()) {
             Transformer transformer = XMLSecurityUtils.getTransformer(
@@ -174,10 +167,13 @@
             loop:
             while (iterator.hasNext()) {
                 XMLSecEvent xmlSecEvent = iterator.next();
-                if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()
-                    && xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
-                    transformer.transform(xmlSecEvent);
-                    break loop;
+                switch (xmlSecEvent.getEventType()) {
+                    case XMLStreamConstants.START_ELEMENT:
+                        if (xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
+                            transformer.transform(xmlSecEvent);
+                            break loop;
+                        }
+                        break;
                 }
             }
 
@@ -185,9 +181,12 @@
             while (iterator.hasNext()) {
                 XMLSecEvent xmlSecEvent = iterator.next();
                 transformer.transform(xmlSecEvent);
-                if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()
-                    && xmlSecEvent.asEndElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
-                    break loop;
+                switch (xmlSecEvent.getEventType()) {
+                    case XMLStreamConstants.END_ELEMENT:
+                        if (xmlSecEvent.asEndElement().getName().equals(XMLSecurityConstants.TAG_dsig_SignedInfo)) {
+                            break loop;
+                        }
+                        break;
                 }
             }
 
@@ -336,15 +335,6 @@
             } catch (NoSuchProviderException e) {
                 throw new XMLSecurityException(e);
             }
-
-            // Clean the secret key from memory now that we're done with it
-            if (verifyKey instanceof Destroyable) {
-                try {
-                    ((Destroyable)verifyKey).destroy();
-                } catch (DestroyFailedException e) {
-                    LOG.debug("Error destroying key: {}", e.getMessage());
-                }
-            }
         }
 
         protected void processEvent(XMLSecEvent xmlSecEvent) throws XMLStreamException {
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureReferenceVerifyInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureReferenceVerifyInputProcessor.java
index d1c6eda..0c679fb 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureReferenceVerifyInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/AbstractSignatureReferenceVerifyInputProcessor.java
@@ -18,26 +18,12 @@
  */
 package org.apache.xml.security.stax.impl.processor.input;
 
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-
+import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
+import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
+import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
+import org.apache.xml.security.utils.XMLUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.apache.xml.security.binding.excc14n.InclusiveNamespaces;
 import org.apache.xml.security.binding.xmldsig.ReferenceType;
 import org.apache.xml.security.binding.xmldsig.SignatureType;
@@ -46,28 +32,26 @@
 import org.apache.xml.security.stax.config.ConfigurationProperties;
 import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
 import org.apache.xml.security.stax.config.ResourceResolverMapper;
-import org.apache.xml.security.stax.ext.AbstractInputProcessor;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.ResourceResolver;
-import org.apache.xml.security.stax.ext.Transformer;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
+import org.apache.xml.security.stax.ext.*;
 import org.apache.xml.security.stax.ext.stax.XMLSecEndElement;
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
 import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_OmitCommentsTransformer;
 import org.apache.xml.security.stax.impl.util.DigestOutputStream;
 import org.apache.xml.security.stax.impl.util.IDGenerator;
 import org.apache.xml.security.stax.impl.util.KeyValue;
 import org.apache.xml.security.stax.securityEvent.AlgorithmSuiteSecurityEvent;
-import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
-import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
-import org.apache.xml.security.utils.XMLUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.util.*;
 
 /**
  */
@@ -104,8 +88,8 @@
                     "secureProcessing.MaximumAllowedReferencesPerManifest",
                     new Object[] {referencesTypeList.size(), maximumAllowedReferencesPerManifest});
         }
-        sameDocumentReferences = new ArrayList<>(referencesTypeList.size());
-        externalReferences = new ArrayList<>(referencesTypeList.size());
+        sameDocumentReferences = new ArrayList<KeyValue<ResourceResolver, ReferenceType>>(referencesTypeList.size());
+        externalReferences = new ArrayList<KeyValue<ResourceResolver, ReferenceType>>(referencesTypeList.size());
         processedReferences = new ArrayList<>(referencesTypeList.size());
 
         Iterator<ReferenceType> referenceTypeIterator = referencesTypeList.iterator();
@@ -162,33 +146,35 @@
             throws XMLStreamException, XMLSecurityException {
 
         XMLSecEvent xmlSecEvent = inputProcessorChain.processEvent();
-        if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-            XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
-            List<ReferenceType> referenceTypes = resolvesResource(xmlSecStartElement);
-            if (!referenceTypes.isEmpty()) {
-                for (int i = 0; i < referenceTypes.size(); i++) {
-                    ReferenceType referenceType = referenceTypes.get(i);
+        switch (xmlSecEvent.getEventType()) {
+            case XMLStreamConstants.START_ELEMENT:
+                XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
+                List<ReferenceType> referenceTypes = resolvesResource(xmlSecStartElement);
+                if (!referenceTypes.isEmpty()) {
+                    for (int i = 0; i < referenceTypes.size(); i++) {
+                        ReferenceType referenceType = referenceTypes.get(i);
 
-                    if (processedReferences.contains(referenceType)) {
-                        throw new XMLSecurityException("signature.Verification.MultipleIDs",
-                                                       new Object[] {referenceType.getURI()});
-                    }
-                    InternalSignatureReferenceVerifier internalSignatureReferenceVerifier =
-                        getSignatureReferenceVerifier(getSecurityProperties(), inputProcessorChain,
-                                                      referenceType, xmlSecStartElement);
-                    if (!internalSignatureReferenceVerifier.isFinished()) {
-                        internalSignatureReferenceVerifier.processEvent(xmlSecEvent, inputProcessorChain);
-                        inputProcessorChain.addProcessor(internalSignatureReferenceVerifier);
-                    }
-                    processedReferences.add(referenceType);
-                    inputProcessorChain.getDocumentContext().setIsInSignedContent(
-                        inputProcessorChain.getProcessors().indexOf(internalSignatureReferenceVerifier),
-                        internalSignatureReferenceVerifier);
+                        if (processedReferences.contains(referenceType)) {
+                            throw new XMLSecurityException("signature.Verification.MultipleIDs",
+                                                           new Object[] {referenceType.getURI()});
+                        }
+                        InternalSignatureReferenceVerifier internalSignatureReferenceVerifier =
+                                getSignatureReferenceVerifier(getSecurityProperties(), inputProcessorChain,
+                                        referenceType, xmlSecStartElement);
+                        if (!internalSignatureReferenceVerifier.isFinished()) {
+                            internalSignatureReferenceVerifier.processEvent(xmlSecEvent, inputProcessorChain);
+                            inputProcessorChain.addProcessor(internalSignatureReferenceVerifier);
+                        }
+                        processedReferences.add(referenceType);
+                        inputProcessorChain.getDocumentContext().setIsInSignedContent(
+                                inputProcessorChain.getProcessors().indexOf(internalSignatureReferenceVerifier),
+                                internalSignatureReferenceVerifier);
 
-                    processElementPath(internalSignatureReferenceVerifier.getStartElementPath(), inputProcessorChain,
-                                       internalSignatureReferenceVerifier.getStartElement(), referenceType);
+                        processElementPath(internalSignatureReferenceVerifier.getStartElementPath(), inputProcessorChain,
+                                internalSignatureReferenceVerifier.getStartElement(), referenceType);
+                    }
                 }
-            }
+                break;
         }
         return xmlSecEvent;
     }
@@ -452,29 +438,32 @@
         }
 
         public void processEvent(XMLSecEvent xmlSecEvent, InputProcessorChain inputProcessorChain)
-            throws XMLStreamException, XMLSecurityException {
+                throws XMLStreamException, XMLSecurityException {
 
             getTransformer().transform(xmlSecEvent);
-            if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-                this.elementCounter++;
-            } else if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-                XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
-                this.elementCounter--;
+            switch (xmlSecEvent.getEventType()) {
+                case XMLStreamConstants.START_ELEMENT:
+                    this.elementCounter++;
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
+                    this.elementCounter--;
 
-                if (this.elementCounter == 0 && xmlSecEndElement.getName().equals(startElement.getName())) {
-                    getTransformer().doFinal();
-                    try {
-                        getBufferedDigestOutputStream().close();
-                    } catch (IOException e) {
-                        throw new XMLSecurityException(e);
+                    if (this.elementCounter == 0 && xmlSecEndElement.getName().equals(startElement.getName())) {
+                        getTransformer().doFinal();
+                        try {
+                            getBufferedDigestOutputStream().close();
+                        } catch (IOException e) {
+                            throw new XMLSecurityException(e);
+                        }
+
+                        compareDigest(this.getDigestOutputStream().getDigestValue(), getReferenceType());
+
+                        inputProcessorChain.removeProcessor(this);
+                        inputProcessorChain.getDocumentContext().unsetIsInSignedContent(this);
+                        setFinished(true);
                     }
-
-                    compareDigest(this.getDigestOutputStream().getDigestValue(), getReferenceType());
-
-                    inputProcessorChain.removeProcessor(this);
-                    inputProcessorChain.getDocumentContext().unsetIsInSignedContent(this);
-                    setFinished(true);
-                }
+                    break;
             }
         }
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/LogInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/LogInputProcessor.java
index 7001297..04618c0 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/LogInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/LogInputProcessor.java
@@ -18,18 +18,14 @@
  */
 package org.apache.xml.security.stax.impl.processor.input;
 
-import java.io.StringWriter;
-
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.AbstractInputProcessor;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+
+import javax.xml.stream.XMLStreamException;
+import java.io.StringWriter;
 
 /**
  */
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLDecryptInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLDecryptInputProcessor.java
index 82cbce0..cb672bc 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLDecryptInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLDecryptInputProcessor.java
@@ -26,18 +26,11 @@
 
 import org.apache.xml.security.binding.xmlenc.EncryptedDataType;
 import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.DocumentContext;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.securityEvent.ContentEncryptedElementSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.EncryptedElementSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.TokenSecurityEvent;
+import org.apache.xml.security.stax.ext.*;
 import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
 import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.securityEvent.*;
 
 
 /**
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEncryptedKeyInputHandler.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEncryptedKeyInputHandler.java
index dd0cf3b..9c6beea 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEncryptedKeyInputHandler.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEncryptedKeyInputHandler.java
@@ -18,23 +18,12 @@
  */
 package org.apache.xml.security.stax.impl.processor.input;
 
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.spec.MGF1ParameterSpec;
-import java.util.Base64;
-import java.util.Deque;
-
-import javax.crypto.Cipher;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.OAEPParameterSpec;
-import javax.crypto.spec.PSource;
-import javax.crypto.spec.SecretKeySpec;
-import javax.xml.bind.JAXBElement;
-
+import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
+import org.apache.xml.security.utils.XMLUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.apache.xml.security.binding.xmldsig.DigestMethodType;
 import org.apache.xml.security.binding.xmldsig.KeyInfoType;
 import org.apache.xml.security.binding.xmlenc.CipherValueType;
@@ -43,24 +32,25 @@
 import org.apache.xml.security.binding.xop.Include;
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
-import org.apache.xml.security.stax.ext.AbstractInputSecurityHeaderHandler;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
+import org.apache.xml.security.stax.ext.*;
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.impl.securityToken.AbstractInboundSecurityToken;
+import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
 import org.apache.xml.security.stax.impl.util.IDGenerator;
 import org.apache.xml.security.stax.securityEvent.AlgorithmSuiteSecurityEvent;
 import org.apache.xml.security.stax.securityEvent.EncryptedKeyTokenSecurityEvent;
-import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
-import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
-import org.apache.xml.security.utils.XMLUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.OAEPParameterSpec;
+import javax.crypto.spec.PSource;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.bind.JAXBElement;
+
+import java.security.*;
+import java.security.spec.MGF1ParameterSpec;
+import java.util.Base64;
+import java.util.Deque;
 
 /**
  * An input handler for the EncryptedKey XML Structure
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEventReaderInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEventReaderInputProcessor.java
index c8035ea..8edd61f 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEventReaderInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLEventReaderInputProcessor.java
@@ -18,21 +18,17 @@
  */
 package org.apache.xml.security.stax.impl.processor.input;
 
-import java.util.NoSuchElementException;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.ConfigurationProperties;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
 
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.ConfigurationProperties;
-import org.apache.xml.security.stax.ext.AbstractInputProcessor;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import java.util.NoSuchElementException;
 
 /**
  * The XMLEventReaderInputProcessor reads requested XMLEvents from the original XMLEventReader
@@ -68,23 +64,26 @@
 
     private XMLSecEvent processNextEventInternal() throws XMLStreamException {
         XMLSecEvent xmlSecEvent = XMLSecEventFactory.allocate(xmlStreamReader, parentXmlSecStartElement);
-        if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-            currentXMLStructureDepth++;
-            if (currentXMLStructureDepth > maximumAllowedXMLStructureDepth) {
-                XMLSecurityException xmlSecurityException = new XMLSecurityException(
-                                                                                     "secureProcessing.MaximumAllowedXMLStructureDepth",
-                                                                                     new Object[] {maximumAllowedXMLStructureDepth}
+        switch (xmlSecEvent.getEventType()) {
+            case XMLStreamConstants.START_ELEMENT:
+                currentXMLStructureDepth++;
+                if (currentXMLStructureDepth > maximumAllowedXMLStructureDepth) {
+                    XMLSecurityException xmlSecurityException = new XMLSecurityException(
+                            "secureProcessing.MaximumAllowedXMLStructureDepth",
+                            new Object[] {maximumAllowedXMLStructureDepth}
                     );
-                throw new XMLStreamException(xmlSecurityException);
-            }
+                    throw new XMLStreamException(xmlSecurityException);
+                }
 
-            parentXmlSecStartElement = (XMLSecStartElement) xmlSecEvent;
-        } else if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-            currentXMLStructureDepth--;
+                parentXmlSecStartElement = (XMLSecStartElement) xmlSecEvent;
+                break;
+            case XMLStreamConstants.END_ELEMENT:
+                currentXMLStructureDepth--;
 
-            if (parentXmlSecStartElement != null) {
-                parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
-            }
+                if (parentXmlSecStartElement != null) {
+                    parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
+                }
+                break;
         }
         if (xmlStreamReader.hasNext()) {
             xmlStreamReader.next();
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSecurityInputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSecurityInputProcessor.java
index 969e3c3..3183655 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSecurityInputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSecurityInputProcessor.java
@@ -74,95 +74,98 @@
         }
 
         XMLSecEvent xmlSecEvent = inputProcessorChain.processEvent();
-        if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-            final XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
+        switch (xmlSecEvent.getEventType()) {
+            case XMLStreamConstants.START_ELEMENT:
+                final XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
 
-            if (!decryptOnly && xmlSecStartElement.getName().equals(XMLSecurityConstants.TAG_dsig_Signature)) {
-                if (signatureElementFound) {
-                    throw new XMLSecurityException("stax.multipleSignaturesNotSupported");
+                if (!decryptOnly && xmlSecStartElement.getName().equals(XMLSecurityConstants.TAG_dsig_Signature)) {
+                    if (signatureElementFound) {
+                        throw new XMLSecurityException("stax.multipleSignaturesNotSupported");
+                    }
+                    signatureElementFound = true;
+                    startIndexForProcessor = internalBufferProcessor.getXmlSecEventList().size() - 1;
+                } else if (xmlSecStartElement.getName().equals(XMLSecurityConstants.TAG_xenc_EncryptedData)) {
+                    encryptedDataElementFound = true;
+
+                    XMLDecryptInputProcessor decryptInputProcessor = new XMLDecryptInputProcessor(getSecurityProperties());
+                    decryptInputProcessor.setPhase(XMLSecurityConstants.Phase.PREPROCESSING);
+                    decryptInputProcessor.addAfterProcessor(XMLEventReaderInputProcessor.class.getName());
+                    decryptInputProcessor.addBeforeProcessor(XMLSecurityInputProcessor.class.getName());
+                    decryptInputProcessor.addBeforeProcessor(XMLSecurityInputProcessor.InternalBufferProcessor.class.getName());
+                    inputProcessorChain.addProcessor(decryptInputProcessor);
+
+                    if (!decryptOnly) {
+                        final ArrayDeque<XMLSecEvent> xmlSecEventList = internalBufferProcessor.getXmlSecEventList();
+                        //remove the last event (EncryptedData)
+                        xmlSecEventList.pollFirst();
+                    }
+
+                    // temporary processor to return the EncryptedData element for the DecryptionProcessor
+                    AbstractInputProcessor abstractInputProcessor = new AbstractInputProcessor(getSecurityProperties()) {
+                        @Override
+                        public XMLSecEvent processNextHeaderEvent(InputProcessorChain inputProcessorChain)
+                                throws XMLStreamException, XMLSecurityException {
+                            return processNextEvent(inputProcessorChain);
+                        }
+
+                        @Override
+                        public XMLSecEvent processNextEvent(InputProcessorChain inputProcessorChain)
+                                throws XMLStreamException, XMLSecurityException {
+                            inputProcessorChain.removeProcessor(this);
+                            return xmlSecStartElement;
+                        }
+                    };
+                    abstractInputProcessor.setPhase(XMLSecurityConstants.Phase.PREPROCESSING);
+                    abstractInputProcessor.addBeforeProcessor(decryptInputProcessor);
+                    inputProcessorChain.addProcessor(abstractInputProcessor);
+
+                    //fetch the next event from the original chain
+                    inputProcessorChain.reset();
+                    xmlSecEvent = inputProcessorChain.processEvent();
+
+                    // no need to catch a possible signature element here because the decrypt processor
+                    // is installed before this processor and therefore the decrypted signature element will
+                    // flow as normal through this processor.
+                    // for safety we do a check if this really true
+                    //check if the decrypted element is a Signature element
+                    if (!decryptOnly && xmlSecEvent.isStartElement() &&
+                            xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_Signature) &&
+                            !signatureElementFound) {
+                        throw new XMLSecurityException("Internal error");
+                    }
                 }
-                signatureElementFound = true;
-                startIndexForProcessor = internalBufferProcessor.getXmlSecEventList().size() - 1;
-            } else if (xmlSecStartElement.getName().equals(XMLSecurityConstants.TAG_xenc_EncryptedData)) {
-                encryptedDataElementFound = true;
+                break;
+            case XMLStreamConstants.END_ELEMENT:
+                XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
+                // Handle the signature
+                if (signatureElementFound
+                        && xmlSecEndElement.getName().equals(XMLSecurityConstants.TAG_dsig_Signature)) {
+                    XMLSignatureInputHandler inputHandler = new XMLSignatureInputHandler();
 
-                XMLDecryptInputProcessor decryptInputProcessor = new XMLDecryptInputProcessor(getSecurityProperties());
-                decryptInputProcessor.setPhase(XMLSecurityConstants.Phase.PREPROCESSING);
-                decryptInputProcessor.addAfterProcessor(XMLEventReaderInputProcessor.class.getName());
-                decryptInputProcessor.addBeforeProcessor(XMLSecurityInputProcessor.class.getName());
-                decryptInputProcessor.addBeforeProcessor(XMLSecurityInputProcessor.InternalBufferProcessor.class.getName());
-                inputProcessorChain.addProcessor(decryptInputProcessor);
-
-                if (!decryptOnly) {
                     final ArrayDeque<XMLSecEvent> xmlSecEventList = internalBufferProcessor.getXmlSecEventList();
-                    //remove the last event (EncryptedData)
-                    xmlSecEventList.pollFirst();
-                }
+                    inputHandler.handle(inputProcessorChain, getSecurityProperties(),
+                            xmlSecEventList, startIndexForProcessor);
 
-                // temporary processor to return the EncryptedData element for the DecryptionProcessor
-                AbstractInputProcessor abstractInputProcessor = new AbstractInputProcessor(getSecurityProperties()) {
-                    @Override
-                    public XMLSecEvent processNextHeaderEvent(InputProcessorChain inputProcessorChain)
-                        throws XMLStreamException, XMLSecurityException {
-                        return processNextEvent(inputProcessorChain);
+                    inputProcessorChain.removeProcessor(internalBufferProcessor);
+
+                    //add the replay processor to the chain...
+                    InternalReplayProcessor internalReplayProcessor =
+                            new InternalReplayProcessor(getSecurityProperties(), xmlSecEventList);
+                    internalReplayProcessor.addBeforeProcessor(XMLSignatureReferenceVerifyInputProcessor.class.getName());
+                    inputProcessorChain.addProcessor(internalReplayProcessor);
+
+                    //...and let the SignatureVerificationProcessor process the buffered events (enveloped signature).
+                    InputProcessorChain subInputProcessorChain = inputProcessorChain.createSubChain(this, false);
+                    while (!xmlSecEventList.isEmpty()) {
+                        subInputProcessorChain.reset();
+                        subInputProcessorChain.processEvent();
                     }
 
-                    @Override
-                    public XMLSecEvent processNextEvent(InputProcessorChain inputProcessorChain)
-                        throws XMLStreamException, XMLSecurityException {
-                        inputProcessorChain.removeProcessor(this);
-                        return xmlSecStartElement;
-                    }
-                };
-                abstractInputProcessor.setPhase(XMLSecurityConstants.Phase.PREPROCESSING);
-                abstractInputProcessor.addBeforeProcessor(decryptInputProcessor);
-                inputProcessorChain.addProcessor(abstractInputProcessor);
-
-                //fetch the next event from the original chain
-                inputProcessorChain.reset();
-                xmlSecEvent = inputProcessorChain.processEvent();
-
-                // no need to catch a possible signature element here because the decrypt processor
-                // is installed before this processor and therefore the decrypted signature element will
-                // flow as normal through this processor.
-                // for safety we do a check if this really true
-                //check if the decrypted element is a Signature element
-                if (!decryptOnly && xmlSecEvent.isStartElement() &&
-                    xmlSecEvent.asStartElement().getName().equals(XMLSecurityConstants.TAG_dsig_Signature) &&
-                    !signatureElementFound) {
-                    throw new XMLSecurityException("Internal error");
+                    // copy all processor back to main chain for finalization
+                    inputProcessorChain.getProcessors().clear();
+                    inputProcessorChain.getProcessors().addAll(subInputProcessorChain.getProcessors());
                 }
-            }
-        } else  if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-            XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
-            // Handle the signature
-            if (signatureElementFound
-                && xmlSecEndElement.getName().equals(XMLSecurityConstants.TAG_dsig_Signature)) {
-                XMLSignatureInputHandler inputHandler = new XMLSignatureInputHandler();
-
-                final ArrayDeque<XMLSecEvent> xmlSecEventList = internalBufferProcessor.getXmlSecEventList();
-                inputHandler.handle(inputProcessorChain, getSecurityProperties(),
-                                    xmlSecEventList, startIndexForProcessor);
-
-                inputProcessorChain.removeProcessor(internalBufferProcessor);
-
-                //add the replay processor to the chain...
-                InternalReplayProcessor internalReplayProcessor =
-                    new InternalReplayProcessor(getSecurityProperties(), xmlSecEventList);
-                internalReplayProcessor.addBeforeProcessor(XMLSignatureReferenceVerifyInputProcessor.class.getName());
-                inputProcessorChain.addProcessor(internalReplayProcessor);
-
-                //...and let the SignatureVerificationProcessor process the buffered events (enveloped signature).
-                InputProcessorChain subInputProcessorChain = inputProcessorChain.createSubChain(this, false);
-                while (!xmlSecEventList.isEmpty()) {
-                    subInputProcessorChain.reset();
-                    subInputProcessorChain.processEvent();
-                }
-
-                // copy all processor back to main chain for finalization
-                inputProcessorChain.getProcessors().clear();
-                inputProcessorChain.getProcessors().addAll(subInputProcessorChain.getProcessors());
-            }
+                break;
         }
 
         return xmlSecEvent;
@@ -181,7 +184,7 @@
      */
     public class InternalBufferProcessor extends AbstractInputProcessor {
 
-        private final ArrayDeque<XMLSecEvent> xmlSecEventList = new ArrayDeque<>();
+        private final ArrayDeque<XMLSecEvent> xmlSecEventList = new ArrayDeque<XMLSecEvent>();
 
         InternalBufferProcessor(XMLSecurityProperties securityProperties) {
             super(securityProperties);
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSignatureInputHandler.java b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSignatureInputHandler.java
index d32138a..0c2d1ed 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSignatureInputHandler.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/input/XMLSignatureInputHandler.java
@@ -20,17 +20,11 @@
 
 import org.apache.xml.security.binding.xmldsig.SignatureType;
 import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.securityEvent.AlgorithmSuiteSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SignatureValueSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.TokenSecurityEvent;
+import org.apache.xml.security.stax.ext.*;
 import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
 import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
 import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
+import org.apache.xml.security.stax.securityEvent.*;
 
 /**
  * An input handler for XML Signature.
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractEncryptOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractEncryptOutputProcessor.java
index 667f6d9..9996f97 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractEncryptOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractEncryptOutputProcessor.java
@@ -18,27 +18,6 @@
  */
 package org.apache.xml.security.stax.impl.processor.output;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.spec.AlgorithmParameterSpec;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.crypto.Cipher;
-import javax.crypto.CipherOutputStream;
-import javax.crypto.NoSuchPaddingException;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLEventWriter;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-
 import org.apache.commons.codec.binary.Base64OutputStream;
 import org.apache.xml.security.algorithms.JCEMapper;
 import org.apache.xml.security.encryption.XMLCipherUtil;
@@ -48,17 +27,27 @@
 import org.apache.xml.security.stax.ext.OutputProcessorChain;
 import org.apache.xml.security.stax.ext.SecurePart;
 import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecCharacters;
-import org.apache.xml.security.stax.ext.stax.XMLSecEndElement;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.ext.stax.*;
 import org.apache.xml.security.stax.impl.EncryptionPartDef;
 import org.apache.xml.security.stax.impl.XMLSecurityEventWriter;
 import org.apache.xml.security.stax.impl.util.TrimmerOutputStream;
 import org.apache.xml.security.utils.XMLUtils;
 
+import javax.crypto.Cipher;
+import javax.crypto.CipherOutputStream;
+import javax.crypto.NoSuchPaddingException;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventWriter;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.*;
+
 /**
  * Processor to encrypt XML structures
  *
@@ -224,16 +213,18 @@
 
                     if (this.elementCounter == 0 && xmlSecStartElement.getName().equals(this.getXmlSecStartElement().getName())) {
                         //if the user selected element encryption we have to encrypt the current element-event...
-                        if (SecurePart.Modifier.Element == getEncryptionPartDef().getModifier()) {
-                            OutputProcessorChain subOutputProcessorChain = outputProcessorChain.createSubChain(this);
-                            processEventInternal(xmlSecStartElement, subOutputProcessorChain);
-                            //encrypt the current element event
-                            encryptEvent(xmlSecEvent);
-                        } else if (SecurePart.Modifier.Content == getEncryptionPartDef().getModifier()) {
-                            OutputProcessorChain subOutputProcessorChain = outputProcessorChain.createSubChain(this);
-                            outputProcessorChain.processEvent(xmlSecEvent);
-                            subOutputProcessorChain = outputProcessorChain.createSubChain(this);
-                            processEventInternal(xmlSecStartElement, subOutputProcessorChain);
+                        switch (getEncryptionPartDef().getModifier()) {
+                            case Element:
+                                OutputProcessorChain subOutputProcessorChain = outputProcessorChain.createSubChain(this);
+                                processEventInternal(xmlSecStartElement, subOutputProcessorChain);
+                                //encrypt the current element event
+                                encryptEvent(xmlSecEvent);
+                                break;
+                            case Content:
+                                outputProcessorChain.processEvent(xmlSecEvent);
+                                subOutputProcessorChain = outputProcessorChain.createSubChain(this);
+                                processEventInternal(xmlSecStartElement, subOutputProcessorChain);
+                                break;
                         }
                     } else {
                         encryptEvent(xmlSecEvent);
@@ -246,12 +237,15 @@
 
                     if (this.elementCounter == 0 && xmlSecEvent.asEndElement().getName().equals(this.getXmlSecStartElement().getName())) {
                         OutputProcessorChain subOutputProcessorChain = outputProcessorChain.createSubChain(this);
-                        if (SecurePart.Modifier.Element == getEncryptionPartDef().getModifier()) {
-                            encryptEvent(xmlSecEvent);
-                            doFinalInternal(subOutputProcessorChain);
-                        } else if (SecurePart.Modifier.Content == getEncryptionPartDef().getModifier()) {
-                            doFinalInternal(subOutputProcessorChain);
-                            outputAsEvent(subOutputProcessorChain, xmlSecEvent);
+                        switch (getEncryptionPartDef().getModifier()) {
+                            case Element:
+                                encryptEvent(xmlSecEvent);
+                                doFinalInternal(subOutputProcessorChain);
+                                break;
+                            case Content:
+                                doFinalInternal(subOutputProcessorChain);
+                                outputAsEvent(subOutputProcessorChain, xmlSecEvent);
+                                break;
                         }
                         subOutputProcessorChain.removeProcessor(this);
                         //from now on encryption is possible again
@@ -386,7 +380,7 @@
      */
     public class CharacterEventGeneratorOutputStream extends OutputStream {
 
-        private final Deque<XMLSecCharacters> charactersBuffer = new ArrayDeque<>();
+        private final Deque<XMLSecCharacters> charactersBuffer = new ArrayDeque<XMLSecCharacters>();
 
         public Deque<XMLSecCharacters> getCharactersBuffer() {
             return charactersBuffer;
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureEndingOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureEndingOutputProcessor.java
index 7a1f091..5bea0ce 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureEndingOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureEndingOutputProcessor.java
@@ -25,8 +25,6 @@
 import java.security.NoSuchProviderException;
 import java.util.*;
 
-import javax.security.auth.DestroyFailedException;
-import javax.security.auth.Destroyable;
 import javax.xml.stream.XMLStreamException;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
@@ -50,15 +48,11 @@
 import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
 import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 import org.apache.xml.security.utils.XMLUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  */
 public abstract class AbstractSignatureEndingOutputProcessor extends AbstractBufferingOutputProcessor {
 
-    private static final transient Logger LOG = LoggerFactory.getLogger(AbstractSignatureEndingOutputProcessor.class);
-
     private List<SignaturePartDef> signaturePartDefList;
 
     public AbstractSignatureEndingOutputProcessor(AbstractSignatureOutputProcessor signatureOutputProcessor)
@@ -226,15 +220,6 @@
             createEndElementAndOutputAsEvent(subOutputProcessorChain, XMLSecurityConstants.TAG_dsig_KeyInfo);
         }
         createEndElementAndOutputAsEvent(subOutputProcessorChain, XMLSecurityConstants.TAG_dsig_Signature);
-
-        // Clean the secret key from memory now that we're done with it
-        if (key instanceof Destroyable) {
-            try {
-                ((Destroyable)key).destroy();
-            } catch (DestroyFailedException e) {
-                LOG.debug("Error destroying key: {}", e.getMessage());
-            }
-        }
     }
 
     protected abstract SignedInfoProcessor newSignedInfoProcessor(
@@ -288,7 +273,7 @@
                 for (Iterator<String> iterator = prefixSet.iterator(); iterator.hasNext(); ) {
                     String prefix = iterator.next();
                     if (prefixes.length() != 0) {
-                        prefixes.append(' ');
+                        prefixes.append(" ");
                     }
                     prefixes.append(prefix);
                 }
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureOutputProcessor.java
index fe2e657..2fc1b75 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/output/AbstractSignatureOutputProcessor.java
@@ -18,43 +18,30 @@
  */
 package org.apache.xml.security.stax.impl.processor.output;
 
+import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
+import org.apache.xml.security.stax.config.ResourceResolverMapper;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.impl.SignaturePartDef;
+import org.apache.xml.security.stax.impl.transformer.TransformIdentity;
+import org.apache.xml.security.stax.impl.util.DigestOutputStream;
+import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
+import org.apache.xml.security.utils.XMLUtils;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
-import org.apache.xml.security.stax.config.ResourceResolverMapper;
-import org.apache.xml.security.stax.ext.AbstractOutputProcessor;
-import org.apache.xml.security.stax.ext.OutputProcessorChain;
-import org.apache.xml.security.stax.ext.ResourceResolver;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.Transformer;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.impl.SignaturePartDef;
-import org.apache.xml.security.stax.impl.transformer.TransformIdentity;
-import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
-import org.apache.xml.security.stax.impl.util.DigestOutputStream;
-import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
-import org.apache.xml.security.utils.XMLUtils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.*;
 
 /**
  */
@@ -233,7 +220,7 @@
                 for (Iterator<String> iterator = prefixSet.iterator(); iterator.hasNext(); ) {
                     String prefix = iterator.next();
                     if (prefixes.length() != 0) {
-                        prefixes.append(' ');
+                        prefixes.append(" ");
                     }
                     prefixes.append(prefix);
                 }
@@ -287,29 +274,32 @@
 
             transformer.transform(xmlSecEvent);
 
-            if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-                elementCounter++;
-            } else if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-                elementCounter--;
+            switch (xmlSecEvent.getEventType()) {
+                case XMLStreamConstants.START_ELEMENT:
+                    elementCounter++;
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    elementCounter--;
 
-                if (elementCounter == 0 &&
-                    xmlSecEvent.asEndElement().getName().equals(this.xmlSecStartElement.getName())) {
+                    if (elementCounter == 0 &&
+                            xmlSecEvent.asEndElement().getName().equals(this.xmlSecStartElement.getName())) {
 
-                    transformer.doFinal();
-                    try {
-                        bufferedDigestOutputStream.close();
-                    } catch (IOException e) {
-                        throw new XMLSecurityException(e);
+                        transformer.doFinal();
+                        try {
+                            bufferedDigestOutputStream.close();
+                        } catch (IOException e) {
+                            throw new XMLSecurityException(e);
+                        }
+                        String calculatedDigest =
+                            XMLUtils.encodeToString(this.digestOutputStream.getDigestValue());
+                        LOG.debug("Calculated Digest: {}", calculatedDigest);
+                        signaturePartDef.setDigestValue(calculatedDigest);
+
+                        outputProcessorChain.removeProcessor(this);
+                        //from now on signature is possible again
+                        setActiveInternalSignatureOutputProcessor(null);
                     }
-                    String calculatedDigest =
-                        XMLUtils.encodeToString(this.digestOutputStream.getDigestValue());
-                    LOG.debug("Calculated Digest: {}", calculatedDigest);
-                    signaturePartDef.setDigestValue(calculatedDigest);
-
-                    outputProcessorChain.removeProcessor(this);
-                    //from now on signature is possible again
-                    setActiveInternalSignatureOutputProcessor(null);
-                }
+                    break;
             }
             outputProcessorChain.processEvent(xmlSecEvent);
         }
diff --git a/src/main/java/org/apache/xml/security/stax/impl/processor/output/XMLEncryptOutputProcessor.java b/src/main/java/org/apache/xml/security/stax/impl/processor/output/XMLEncryptOutputProcessor.java
index 1264d24..b489ca8 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/processor/output/XMLEncryptOutputProcessor.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/processor/output/XMLEncryptOutputProcessor.java
@@ -18,16 +18,20 @@
  */
 package org.apache.xml.security.stax.impl.processor.output;
 
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.cert.X509Certificate;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.MGF1ParameterSpec;
-import java.util.ArrayList;
-import java.util.List;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
+import org.apache.xml.security.utils.XMLUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.impl.EncryptionPartDef;
+import org.apache.xml.security.stax.securityToken.OutboundSecurityToken;
+import org.apache.xml.security.stax.impl.util.IDGenerator;
 
 import javax.crypto.Cipher;
 import javax.crypto.IllegalBlockSizeException;
@@ -37,23 +41,12 @@
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.JCEAlgorithmMapper;
-import org.apache.xml.security.stax.ext.OutputProcessorChain;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
-import org.apache.xml.security.stax.impl.EncryptionPartDef;
-import org.apache.xml.security.stax.impl.util.IDGenerator;
-import org.apache.xml.security.stax.securityToken.OutboundSecurityToken;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.stax.securityToken.SecurityTokenProvider;
-import org.apache.xml.security.utils.XMLUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.security.*;
+import java.security.cert.X509Certificate;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.MGF1ParameterSpec;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Processor to encrypt XML structures
diff --git a/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverSameDocument.java b/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverSameDocument.java
index 78413f7..2f3af6f 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverSameDocument.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverSameDocument.java
@@ -18,17 +18,13 @@
  */
 package org.apache.xml.security.stax.impl.resourceResolvers;
 
-import java.io.InputStream;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.events.Attribute;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.ResourceResolver;
-import org.apache.xml.security.stax.ext.ResourceResolverLookup;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import java.io.InputStream;
 
 /**
  * Resolver for references in the same document.
diff --git a/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverXPointer.java b/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverXPointer.java
index be2c4ca..d1f3ee5 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverXPointer.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/resourceResolvers/ResolverXPointer.java
@@ -106,7 +106,10 @@
         }
         //case #xpointer(id('ID')):
         Attribute attribute = xmlSecStartElement.getAttributeByName(idAttributeNS);
-        return attribute != null && attribute.getValue().equals(id);
+        if (attribute != null && attribute.getValue().equals(id)) {
+            return true;
+        }
+        return false;
     }
 
     @Override
diff --git a/src/main/java/org/apache/xml/security/stax/impl/securityToken/AbstractSecurityToken.java b/src/main/java/org/apache/xml/security/stax/impl/securityToken/AbstractSecurityToken.java
index 8da4153..6cf89f2 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/securityToken/AbstractSecurityToken.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/securityToken/AbstractSecurityToken.java
@@ -43,8 +43,8 @@
     private boolean asymmetric = false;
     private String sha1Identifier;
 
-    protected final Map<String, Key> keyTable = new HashMap<>();
-    protected final List<SecurityTokenConstants.TokenUsage> tokenUsages = new ArrayList<>();
+    protected final Map<String, Key> keyTable = new HashMap<String, Key>();
+    protected final List<SecurityTokenConstants.TokenUsage> tokenUsages = new ArrayList<SecurityTokenConstants.TokenUsage>();
 
     public AbstractSecurityToken(String id) {
         if (id == null || id.isEmpty()) {
diff --git a/src/main/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImpl.java b/src/main/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImpl.java
index 5378e19..8a0eeed 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImpl.java
@@ -18,6 +18,18 @@
  */
 package org.apache.xml.security.stax.impl.securityToken;
 
+import org.apache.xml.security.binding.xmldsig.*;
+import org.apache.xml.security.binding.xmldsig11.ECKeyValueType;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.impl.util.IDGenerator;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants.TokenType;
+import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
+import org.apache.xml.security.utils.RFC2253Parser;
+import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.Key;
@@ -27,26 +39,6 @@
 import java.security.cert.X509Certificate;
 import java.util.Map;
 
-import org.apache.xml.security.binding.xmldsig.DSAKeyValueType;
-import org.apache.xml.security.binding.xmldsig.KeyInfoType;
-import org.apache.xml.security.binding.xmldsig.KeyValueType;
-import org.apache.xml.security.binding.xmldsig.RSAKeyValueType;
-import org.apache.xml.security.binding.xmldsig.X509DataType;
-import org.apache.xml.security.binding.xmldsig.X509IssuerSerialType;
-import org.apache.xml.security.binding.xmldsig11.ECKeyValueType;
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.InboundSecurityContext;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.impl.util.IDGenerator;
-import org.apache.xml.security.stax.securityToken.InboundSecurityToken;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants.TokenType;
-import org.apache.xml.security.stax.securityToken.SecurityTokenFactory;
-import org.apache.xml.security.utils.RFC2253Parser;
-import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
-
 /**
  * Factory to create SecurityToken Objects from keys in XML
  *
diff --git a/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecAttributeImpl.java b/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecAttributeImpl.java
index cf14530..b8a6182 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecAttributeImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecAttributeImpl.java
@@ -134,14 +134,17 @@
         int idx = 0;
         while (i < length) {
             char c = text.charAt(i);
-            if (c == '&') {
-                writer.write(text, idx, i - idx);
-                writer.write("&amp;");
-                idx = i + 1;
-            } else if (c == '"') {
-                writer.write(text, idx, i - idx);
-                writer.write("&quot;");
-                idx = i + 1;
+            switch (c) {
+                case '&':
+                    writer.write(text, idx, i - idx);
+                    writer.write("&amp;");
+                    idx = i + 1;
+                    break;
+                case '"':
+                    writer.write(text, idx, i - idx);
+                    writer.write("&quot;");
+                    idx = i + 1;
+                    break;
             }
             i++;
         }
diff --git a/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecNamespaceImpl.java b/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecNamespaceImpl.java
index 7bba770..a4edc75 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecNamespaceImpl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/stax/XMLSecNamespaceImpl.java
@@ -33,10 +33,10 @@
  * Class to let XML-Namespaces be comparable how it is requested by C14N
  *
  */
-public final class XMLSecNamespaceImpl extends XMLSecEventBaseImpl implements XMLSecNamespace {
+public class XMLSecNamespaceImpl extends XMLSecEventBaseImpl implements XMLSecNamespace {
 
     private static final Map<String, Map<String, XMLSecNamespace>> xmlSecNamespaceMap =
-            new WeakHashMap<>();
+            new WeakHashMap<String, Map<String, XMLSecNamespace>>();
 
     private String prefix;
     private final String uri;
@@ -68,7 +68,7 @@
                 return xmlSecNamespace;
             }
         } else {
-            nsMap = new WeakHashMap<>();
+            nsMap = new WeakHashMap<String, XMLSecNamespace>();
             XMLSecNamespace xmlSecNamespace = new XMLSecNamespaceImpl(prefixToUse, uriToUse);
             nsMap.put(uriToUse, xmlSecNamespace);
             xmlSecNamespaceMap.put(prefixToUse, nsMap);
@@ -174,14 +174,17 @@
         int idx = 0;
         while (i < length) {
             char c = text.charAt(i);
-            if (c == '&') {
-                writer.write(text, idx, i - idx);
-                writer.write("&amp;");
-                idx = i + 1;
-            } else if (c == '"') {
-                writer.write(text, idx, i - idx);
-                writer.write("&quot;");
-                idx = i + 1;
+            switch (c) {
+                case '&':
+                    writer.write(text, idx, i - idx);
+                    writer.write("&amp;");
+                    idx = i + 1;
+                    break;
+                case '"':
+                    writer.write(text, idx, i - idx);
+                    writer.write("&quot;");
+                    idx = i + 1;
+                    break;
             }
             i++;
         }
diff --git a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformBase64Decode.java b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformBase64Decode.java
index 0421839..8e2469b 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformBase64Decode.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformBase64Decode.java
@@ -66,103 +66,110 @@
     @Override
     public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
         int eventType = xmlSecEvent.getEventType();
-        if (XMLStreamConstants.CHARACTERS == eventType) {
-            if (getOutputStream() != null) {
-                //we have an output stream
-                //encoding shouldn't matter here, because the data is Base64 encoded and is therefore in the ASCII range.
-                try {
-                    getOutputStream().write(xmlSecEvent.asCharacters().getData().getBytes());
-                } catch (IOException e) {
-                    throw new XMLStreamException(e);
-                }
-            } else {
-                //we have a child transformer
-                if (childOutputMethod == null) {
+        switch (eventType) {
+            case XMLStreamConstants.CHARACTERS:
+                if (getOutputStream() != null) {
+                    //we have an output stream
+                    //encoding shouldn't matter here, because the data is Base64 encoded and is therefore in the ASCII range.
+                    try {
+                        getOutputStream().write(xmlSecEvent.asCharacters().getData().getBytes());
+                    } catch (IOException e) {
+                        throw new XMLStreamException(e);
+                    }
+                } else {
+                    //we have a child transformer
+                    if (childOutputMethod == null) {
 
-                    final XMLSecurityConstants.TransformMethod preferredChildTransformMethod =
-                        getTransformer().getPreferredTransformMethod(XMLSecurityConstants.TransformMethod.XMLSecEvent);
+                        final XMLSecurityConstants.TransformMethod preferredChildTransformMethod =
+                                getTransformer().getPreferredTransformMethod(XMLSecurityConstants.TransformMethod.XMLSecEvent);
 
-                    if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.XMLSecEvent) {
-                        childOutputMethod = new ChildOutputMethod() {
+                        switch (preferredChildTransformMethod) {
+                            case XMLSecEvent: {
+                                childOutputMethod = new ChildOutputMethod() {
 
-                            private UnsyncByteArrayOutputStream byteArrayOutputStream;
-                            private Base64OutputStream base64OutputStream;
+                                    private UnsyncByteArrayOutputStream byteArrayOutputStream;
+                                    private Base64OutputStream base64OutputStream;
 
-                            @Override
-                            public void transform(Object object) throws XMLStreamException {
-                                if (base64OutputStream == null) {
-                                    byteArrayOutputStream = new UnsyncByteArrayOutputStream();
-                                    base64OutputStream = new Base64OutputStream(byteArrayOutputStream, false);
-                                }
-                                try {
-                                    base64OutputStream.write((byte[]) object);
-                                } catch (IOException e) {
-                                    throw new XMLStreamException(e);
-                                }
+                                    @Override
+                                    public void transform(Object object) throws XMLStreamException {
+                                        if (base64OutputStream == null) {
+                                            byteArrayOutputStream = new UnsyncByteArrayOutputStream();
+                                            base64OutputStream = new Base64OutputStream(byteArrayOutputStream, false);
+                                        }
+                                        try {
+                                            base64OutputStream.write((byte[]) object);
+                                        } catch (IOException e) {
+                                            throw new XMLStreamException(e);
+                                        }
+                                    }
+
+                                    @Override
+                                    public void doFinal() throws XMLStreamException {
+                                        try {
+                                            base64OutputStream.close();
+                                        } catch (IOException e) {
+                                            throw new XMLStreamException(e);
+                                        }
+
+                                        try (InputStream is = new UnsyncByteArrayInputStream(byteArrayOutputStream.toByteArray())) {
+                                            XMLEventReaderInputProcessor xmlEventReaderInputProcessor
+                                                = new XMLEventReaderInputProcessor(null,
+                                                                                   getXmlInputFactory().createXMLStreamReader(is)
+                                                );
+                                            XMLSecEvent xmlSecEvent;
+                                            do {
+                                                xmlSecEvent = xmlEventReaderInputProcessor.processNextEvent(null);
+                                                getTransformer().transform(xmlSecEvent);
+                                            } while (xmlSecEvent.getEventType() != XMLStreamConstants.END_DOCUMENT);
+                                        } catch (XMLSecurityException | IOException e) {
+                                            throw new XMLStreamException(e);
+                                        }
+                                        getTransformer().doFinal();
+                                    }
+                                };
+                                break;
                             }
+                            case InputStream: {
+                                childOutputMethod = new ChildOutputMethod() {
 
-                            @Override
-                            public void doFinal() throws XMLStreamException {
-                                try {
-                                    base64OutputStream.close();
-                                } catch (IOException e) {
-                                    throw new XMLStreamException(e);
-                                }
+                                    private UnsyncByteArrayOutputStream byteArrayOutputStream;
+                                    private Base64OutputStream base64OutputStream;
 
-                                try (InputStream is = new UnsyncByteArrayInputStream(byteArrayOutputStream.toByteArray())) {
-                                    XMLEventReaderInputProcessor xmlEventReaderInputProcessor
-                                    = new XMLEventReaderInputProcessor(null,
-                                                                       getXmlInputFactory().createXMLStreamReader(is)
-                                        );
-                                    XMLSecEvent xmlSecEvent;
-                                    do {
-                                        xmlSecEvent = xmlEventReaderInputProcessor.processNextEvent(null);
-                                        getTransformer().transform(xmlSecEvent);
-                                    } while (xmlSecEvent.getEventType() != XMLStreamConstants.END_DOCUMENT);
-                                } catch (XMLSecurityException | IOException e) {
-                                    throw new XMLStreamException(e);
-                                }
-                                getTransformer().doFinal();
+                                    @Override
+                                    public void transform(Object object) throws XMLStreamException {
+                                        if (base64OutputStream == null) {
+                                            byteArrayOutputStream = new UnsyncByteArrayOutputStream();
+                                            base64OutputStream = new Base64OutputStream(byteArrayOutputStream, false);
+                                        }
+                                        try {
+                                            base64OutputStream.write((byte[]) object);
+                                        } catch (IOException e) {
+                                            throw new XMLStreamException(e);
+                                        }
+                                    }
+
+                                    @Override
+                                    public void doFinal() throws XMLStreamException {
+                                        try {
+                                            base64OutputStream.close();
+                                        } catch (IOException e) {
+                                            throw new XMLStreamException(e);
+                                        }
+                                        try (InputStream is = new UnsyncByteArrayInputStream(byteArrayOutputStream.toByteArray())) {
+                                            getTransformer().transform(is);
+                                            getTransformer().doFinal();
+                                        } catch (IOException ex) {
+                                            throw new XMLStreamException(ex);
+                                        }
+                                    }
+                                };
+                                break;
                             }
-                        };
-                    } else if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.InputStream) {
-                        childOutputMethod = new ChildOutputMethod() {
-
-                            private UnsyncByteArrayOutputStream byteArrayOutputStream;
-                            private Base64OutputStream base64OutputStream;
-
-                            @Override
-                            public void transform(Object object) throws XMLStreamException {
-                                if (base64OutputStream == null) {
-                                    byteArrayOutputStream = new UnsyncByteArrayOutputStream();
-                                    base64OutputStream = new Base64OutputStream(byteArrayOutputStream, false);
-                                }
-                                try {
-                                    base64OutputStream.write((byte[]) object);
-                                } catch (IOException e) {
-                                    throw new XMLStreamException(e);
-                                }
-                            }
-
-                            @Override
-                            public void doFinal() throws XMLStreamException {
-                                try {
-                                    base64OutputStream.close();
-                                } catch (IOException e) {
-                                    throw new XMLStreamException(e);
-                                }
-                                try (InputStream is = new UnsyncByteArrayInputStream(byteArrayOutputStream.toByteArray())) {
-                                    getTransformer().transform(is);
-                                    getTransformer().doFinal();
-                                } catch (IOException ex) {
-                                    throw new XMLStreamException(ex);
-                                }
-                            }
-                        };
+                        }
                     }
                     childOutputMethod.transform(xmlSecEvent.asCharacters().getData().getBytes());
                 }
-            }
+                break;
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformEnvelopedSignature.java b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformEnvelopedSignature.java
index b39c8bc..50e7477 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformEnvelopedSignature.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformEnvelopedSignature.java
@@ -48,20 +48,22 @@
 
     @Override
     public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-        if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-            curLevel++;
-            XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
-            if (XMLSecurityConstants.TAG_dsig_Signature.equals(xmlSecStartElement.getName())) {
-                sigElementLevel = curLevel;
-                return;
-            }
-        } else if (XMLStreamConstants.END_ELEMENT == xmlSecEvent.getEventType()) {
-            XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
-            if (sigElementLevel == curLevel && XMLSecurityConstants.TAG_dsig_Signature.equals(xmlSecEndElement.getName())) {
-                sigElementLevel = -1;
-                return;
-            }
-            curLevel--;
+        switch (xmlSecEvent.getEventType()) {
+            case XMLStreamConstants.START_ELEMENT:
+                curLevel++;
+                XMLSecStartElement xmlSecStartElement = xmlSecEvent.asStartElement();
+                if (XMLSecurityConstants.TAG_dsig_Signature.equals(xmlSecStartElement.getName())) {
+                    sigElementLevel = curLevel;
+                    return;
+                }
+                break;
+            case XMLStreamConstants.END_ELEMENT:
+                XMLSecEndElement xmlSecEndElement = xmlSecEvent.asEndElement();
+                if (sigElementLevel == curLevel && XMLSecurityConstants.TAG_dsig_Signature.equals(xmlSecEndElement.getName())) {
+                    sigElementLevel = -1;
+                    return;
+                }
+                curLevel--;
         }
         if (sigElementLevel == -1) {
             super.transform(xmlSecEvent);
diff --git a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformIdentity.java b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformIdentity.java
index f88f2bb..866e02e 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformIdentity.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/transformer/TransformIdentity.java
@@ -123,46 +123,51 @@
                 final XMLSecurityConstants.TransformMethod preferredChildTransformMethod =
                         getTransformer().getPreferredTransformMethod(XMLSecurityConstants.TransformMethod.XMLSecEvent);
 
-                if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.XMLSecEvent) {
-                    childOutputMethod = new ChildOutputMethod() {
+                switch (preferredChildTransformMethod) {
+                    case XMLSecEvent: {
+                        childOutputMethod = new ChildOutputMethod() {
 
-                        @Override
-                        public void transform(Object object) throws XMLStreamException {
-                            getTransformer().transform((XMLSecEvent) object);
-                        }
-
-                        @Override
-                        public void doFinal() throws XMLStreamException {
-                            getTransformer().doFinal();
-                        }
-                    };
-                } else if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.InputStream) {
-                    childOutputMethod = new ChildOutputMethod() {
-
-                        private UnsyncByteArrayOutputStream baos;
-                        private XMLEventWriter xmlEventWriter;
-
-                        @Override
-                        public void transform(Object object) throws XMLStreamException {
-                            if (xmlEventWriter == null) {
-                                baos = new UnsyncByteArrayOutputStream();
-                                xmlEventWriter = getXmlOutputFactory().createXMLEventWriter(baos);
+                            @Override
+                            public void transform(Object object) throws XMLStreamException {
+                                getTransformer().transform((XMLSecEvent) object);
                             }
 
-                            xmlEventWriter.add((XMLSecEvent) object);
-                        }
-
-                        @Override
-                        public void doFinal() throws XMLStreamException {
-                            xmlEventWriter.close();
-                            try (InputStream is = new UnsyncByteArrayInputStream(baos.toByteArray())) {
-                                getTransformer().transform(is);
+                            @Override
+                            public void doFinal() throws XMLStreamException {
                                 getTransformer().doFinal();
-                            } catch (IOException ex) {
-                                throw new XMLStreamException(ex);
                             }
-                        }
-                    };
+                        };
+                        break;
+                    }
+                    case InputStream: {
+                        childOutputMethod = new ChildOutputMethod() {
+
+                            private UnsyncByteArrayOutputStream baos;
+                            private XMLEventWriter xmlEventWriter;
+
+                            @Override
+                            public void transform(Object object) throws XMLStreamException {
+                                if (xmlEventWriter == null) {
+                                    baos = new UnsyncByteArrayOutputStream();
+                                    xmlEventWriter = getXmlOutputFactory().createXMLEventWriter(baos);
+                                }
+
+                                xmlEventWriter.add((XMLSecEvent) object);
+                            }
+
+                            @Override
+                            public void doFinal() throws XMLStreamException {
+                                xmlEventWriter.close();
+                                try (InputStream is = new UnsyncByteArrayInputStream(baos.toByteArray())) {
+                                    getTransformer().transform(is);
+                                    getTransformer().doFinal();
+                                } catch (IOException ex) {
+                                    throw new XMLStreamException(ex);
+                                }
+                            }
+                        };
+                        break;
+                    }
                 }
             }
             if (childOutputMethod != null) {
@@ -187,49 +192,54 @@
                 final XMLSecurityConstants.TransformMethod preferredChildTransformMethod =
                         getTransformer().getPreferredTransformMethod(XMLSecurityConstants.TransformMethod.InputStream);
 
-                if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.XMLSecEvent) {
-                    childOutputMethod = new ChildOutputMethod() {
+                switch (preferredChildTransformMethod) {
+                    case XMLSecEvent: {
+                        childOutputMethod = new ChildOutputMethod() {
 
-                        private XMLEventReaderInputProcessor xmlEventReaderInputProcessor;
+                            private XMLEventReaderInputProcessor xmlEventReaderInputProcessor;
 
-                        @Override
-                        public void transform(Object object) throws XMLStreamException {
-                            if (xmlEventReaderInputProcessor == null) {
-                                xmlEventReaderInputProcessor = new XMLEventReaderInputProcessor(
-                                    null,
-                                    getXmlInputFactory().createXMLStreamReader(inputStream)
-                                );
+                            @Override
+                            public void transform(Object object) throws XMLStreamException {
+                                if (xmlEventReaderInputProcessor == null) {
+                                    xmlEventReaderInputProcessor = new XMLEventReaderInputProcessor(
+                                            null,
+                                            getXmlInputFactory().createXMLStreamReader(inputStream)
+                                    );
+                                }
+                                try {
+                                    XMLSecEvent xmlSecEvent;
+                                    do {
+                                        xmlSecEvent = xmlEventReaderInputProcessor.processNextEvent(null);
+                                        getTransformer().transform(xmlSecEvent);
+                                    } while (xmlSecEvent.getEventType() != XMLStreamConstants.END_DOCUMENT);
+                                } catch (XMLSecurityException e) {
+                                    throw new XMLStreamException(e);
+                                }
                             }
-                            try {
-                                XMLSecEvent xmlSecEvent;
-                                do {
-                                    xmlSecEvent = xmlEventReaderInputProcessor.processNextEvent(null);
-                                    getTransformer().transform(xmlSecEvent);
-                                } while (xmlSecEvent.getEventType() != XMLStreamConstants.END_DOCUMENT);
-                            } catch (XMLSecurityException e) {
-                                throw new XMLStreamException(e);
+
+                            @Override
+                            public void doFinal() throws XMLStreamException {
+                                getTransformer().doFinal();
                             }
-                        }
+                        };
+                        break;
+                    }
+                    case InputStream: {
+                        childOutputMethod = new ChildOutputMethod() {
 
-                        @Override
-                        public void doFinal() throws XMLStreamException {
-                            getTransformer().doFinal();
-                        }
-                    };
-                } else if (preferredChildTransformMethod == XMLSecurityConstants.TransformMethod.InputStream) {
-                    childOutputMethod = new ChildOutputMethod() {
+                            @Override
+                            public void transform(Object object) throws XMLStreamException {
+                                getTransformer().transform(inputStream);
+                            }
 
-                        @Override
-                        public void transform(Object object) throws XMLStreamException {
-                            getTransformer().transform(inputStream);
-                        }
+                            @Override
+                            public void doFinal() throws XMLStreamException {
+                                getTransformer().doFinal();
+                            }
 
-                        @Override
-                        public void doFinal() throws XMLStreamException {
-                            getTransformer().doFinal();
-                        }
-
-                    };
+                        };
+                        break;
+                    }
                 }
             }
             if (childOutputMethod != null) {
diff --git a/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/Canonicalizer20010315_Excl.java b/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/Canonicalizer20010315_Excl.java
index 5701aa8..3073ec8 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/Canonicalizer20010315_Excl.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/Canonicalizer20010315_Excl.java
@@ -18,17 +18,10 @@
  */
 package org.apache.xml.security.stax.impl.transformer.canonicalizer;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.ext.stax.*;
+
+import java.util.*;
 
 /**
  */
diff --git a/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/CanonicalizerBase.java b/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/CanonicalizerBase.java
index 2bbc6ef..fb49d3b 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/CanonicalizerBase.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/transformer/canonicalizer/CanonicalizerBase.java
@@ -18,39 +18,22 @@
  */
 package org.apache.xml.security.stax.impl.transformer.canonicalizer;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-
 import org.apache.xml.security.c14n.implementations.UtfHelpper;
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.stax.ext.Transformer;
 import org.apache.xml.security.stax.ext.XMLSecurityConstants;
 import org.apache.xml.security.stax.ext.XMLSecurityUtils;
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecComment;
-import org.apache.xml.security.stax.ext.stax.XMLSecEndElement;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecProcessingInstruction;
-import org.apache.xml.security.stax.ext.stax.XMLSecStartElement;
+import org.apache.xml.security.stax.ext.stax.*;
 import org.apache.xml.security.stax.impl.processor.input.XMLEventReaderInputProcessor;
 import org.apache.xml.security.stax.impl.transformer.TransformIdentity;
 import org.apache.xml.security.utils.UnsyncByteArrayInputStream;
 import org.apache.xml.security.utils.UnsyncByteArrayOutputStream;
 
+import javax.xml.namespace.QName;
+import javax.xml.stream.*;
+import java.io.*;
+import java.util.*;
+
 /**
  */
 public abstract class CanonicalizerBase extends TransformIdentity {
@@ -80,8 +63,8 @@
         NODE_AFTER_DOCUMENT_ELEMENT
     }
 
-    private static final Map<String, byte[]> cache = new WeakHashMap<>();
-    private final C14NStack<XMLSecEvent> outputStack = new C14NStack<>();
+    private static final Map<String, byte[]> cache = new WeakHashMap<String, byte[]>();
+    private final C14NStack<XMLSecEvent> outputStack = new C14NStack<XMLSecEvent>();
     private boolean includeComments = false;
     private DocumentLevel currentDocumentLevel = DocumentLevel.NODE_BEFORE_DOCUMENT_ELEMENT;
 
diff --git a/src/main/java/org/apache/xml/security/stax/impl/util/DigestOutputStream.java b/src/main/java/org/apache/xml/security/stax/impl/util/DigestOutputStream.java
index 84628cf..c7c4dfd 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/util/DigestOutputStream.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/util/DigestOutputStream.java
@@ -34,7 +34,7 @@
     protected static final transient boolean isDebugEnabled = LOG.isDebugEnabled();
 
     private final MessageDigest messageDigest;
-    private StringBuilder stringBuilder; //NOPMD
+    private StringBuilder stringBuilder;
 
     public DigestOutputStream(MessageDigest messageDigest) {
         this.messageDigest = messageDigest;
diff --git a/src/main/java/org/apache/xml/security/stax/impl/util/SignerOutputStream.java b/src/main/java/org/apache/xml/security/stax/impl/util/SignerOutputStream.java
index 791db85..72ec26a 100644
--- a/src/main/java/org/apache/xml/security/stax/impl/util/SignerOutputStream.java
+++ b/src/main/java/org/apache/xml/security/stax/impl/util/SignerOutputStream.java
@@ -33,7 +33,7 @@
     protected static final transient boolean isDebugEnabled = LOG.isDebugEnabled();
 
     private final SignatureAlgorithm signatureAlgorithm;
-    private StringBuilder stringBuilder; //NOPMD
+    private StringBuilder stringBuilder;
 
     public SignerOutputStream(SignatureAlgorithm signatureAlgorithm) {
         this.signatureAlgorithm = signatureAlgorithm;
diff --git a/src/main/java/org/apache/xml/security/stax/securityToken/SecurityTokenFactory.java b/src/main/java/org/apache/xml/security/stax/securityToken/SecurityTokenFactory.java
index 54cdbdb..871e137 100644
--- a/src/main/java/org/apache/xml/security/stax/securityToken/SecurityTokenFactory.java
+++ b/src/main/java/org/apache/xml/security/stax/securityToken/SecurityTokenFactory.java
@@ -31,10 +31,10 @@
  */
 public abstract class SecurityTokenFactory {
 
-    private static SecurityTokenFactory instance;
+    private static SecurityTokenFactory securityTokenFactory;
 
     public static synchronized SecurityTokenFactory getInstance() throws XMLSecurityException {
-        if (instance == null) {
+        if (securityTokenFactory == null) {
             String stf = ConfigurationProperties.getProperty("securityTokenFactory");
             if (stf == null) {
                 throw new XMLSecurityException("algorithm.ClassDoesNotExist",
@@ -49,7 +49,7 @@
                 @SuppressWarnings("unchecked")
                 Class<SecurityTokenFactory> securityTokenFactoryClass =
                         (Class<SecurityTokenFactory>) ClassLoaderUtils.loadClass(stf, callingClass);
-                instance = securityTokenFactoryClass.newInstance();
+                securityTokenFactory = securityTokenFactoryClass.newInstance();
             } catch (ClassNotFoundException e) {
                 throw new XMLSecurityException(e, "algorithm.ClassDoesNotExist", new Object[]{stf});
             } catch (InstantiationException e) {
@@ -58,7 +58,7 @@
                 throw new XMLSecurityException(e, "algorithm.ClassDoesNotExist", new Object[]{stf});
             }
         }
-        return instance;
+        return securityTokenFactory;
     }
 
     public abstract InboundSecurityToken getSecurityToken(
diff --git a/src/main/java/org/apache/xml/security/transforms/InvalidTransformException.java b/src/main/java/org/apache/xml/security/transforms/InvalidTransformException.java
index fb11f31..95b9ec0 100644
--- a/src/main/java/org/apache/xml/security/transforms/InvalidTransformException.java
+++ b/src/main/java/org/apache/xml/security/transforms/InvalidTransformException.java
@@ -53,7 +53,7 @@
      * @param msgId
      * @param exArgs
      */
-    public InvalidTransformException(String msgId, Object[] exArgs) {
+    public InvalidTransformException(String msgId, Object exArgs[]) {
         super(msgId, exArgs);
     }
 
@@ -79,7 +79,7 @@
      * @param exArgs
      * @param originalException
      */
-    public InvalidTransformException(Exception originalException, String msgId, Object[] exArgs) {
+    public InvalidTransformException(Exception originalException, String msgId, Object exArgs[]) {
         super(originalException, msgId, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/transforms/Transform.java b/src/main/java/org/apache/xml/security/transforms/Transform.java
index 59a26ad..3200dfb 100644
--- a/src/main/java/org/apache/xml/security/transforms/Transform.java
+++ b/src/main/java/org/apache/xml/security/transforms/Transform.java
@@ -70,7 +70,7 @@
 
     /** All available Transform classes are registered here */
     private static Map<String, Class<? extends TransformSpi>> transformSpiHash =
-        new ConcurrentHashMap<>();
+        new ConcurrentHashMap<String, Class<? extends TransformSpi>>();
 
     private final TransformSpi transformSpi;
     private boolean secureValidation;
@@ -146,24 +146,24 @@
         String algorithmURI = element.getAttributeNS(null, Constants._ATT_ALGORITHM);
 
         if (algorithmURI == null || algorithmURI.length() == 0) {
-            Object[] exArgs = { Constants._ATT_ALGORITHM, Constants._TAG_TRANSFORM };
+            Object exArgs[] = { Constants._ATT_ALGORITHM, Constants._TAG_TRANSFORM };
             throw new TransformationException("xml.WrongContent", exArgs);
         }
 
         Class<? extends TransformSpi> transformSpiClass = transformSpiHash.get(algorithmURI);
         if (transformSpiClass == null) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException("signature.Transform.UnknownTransform", exArgs);
         }
         try {
             transformSpi = transformSpiClass.newInstance();
         } catch (InstantiationException ex) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
                 ex, "signature.Transform.UnknownTransform", exArgs
             );
         } catch (IllegalAccessException ex) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
                 ex, "signature.Transform.UnknownTransform", exArgs
             );
@@ -189,7 +189,7 @@
         // are we already registered?
         Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
         if (transformSpi != null) {
-            Object[] exArgs = { algorithmURI, transformSpi };
+            Object exArgs[] = { algorithmURI, transformSpi };
             throw new AlgorithmAlreadyRegisteredException("algorithm.alreadyRegistered", exArgs);
         }
         Class<? extends TransformSpi> transformSpiClass =
@@ -215,7 +215,7 @@
         // are we already registered?
         Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
         if (transformSpi != null) {
-            Object[] exArgs = { algorithmURI, transformSpi };
+            Object exArgs[] = { algorithmURI, transformSpi };
             throw new AlgorithmAlreadyRegisteredException("algorithm.alreadyRegistered", exArgs);
         }
         transformSpiHash.put(algorithmURI, implementingClass);
@@ -310,11 +310,11 @@
             transformSpi.secureValidation = secureValidation;
             result = transformSpi.enginePerformTransform(input, os, this);
         } catch (ParserConfigurationException ex) {
-            Object[] exArgs = { this.getURI(), "ParserConfigurationException" };
+            Object exArgs[] = { this.getURI(), "ParserConfigurationException" };
             throw new CanonicalizationException(
                 ex, "signature.Transform.ErrorDuringTransform", exArgs);
         } catch (SAXException ex) {
-            Object[] exArgs = { this.getURI(), "SAXException" };
+            Object exArgs[] = { this.getURI(), "SAXException" };
             throw new CanonicalizationException(
                 ex, "signature.Transform.ErrorDuringTransform", exArgs);
         }
@@ -337,19 +337,19 @@
 
         Class<? extends TransformSpi> transformSpiClass = transformSpiHash.get(algorithmURI);
         if (transformSpiClass == null) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException("signature.Transform.UnknownTransform", exArgs);
         }
         TransformSpi newTransformSpi = null;
         try {
             newTransformSpi = transformSpiClass.newInstance();
         } catch (InstantiationException ex) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
                 ex, "signature.Transform.UnknownTransform", exArgs
             );
         } catch (IllegalAccessException ex) {
-            Object[] exArgs = { algorithmURI };
+            Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
                 ex, "signature.Transform.UnknownTransform", exArgs
             );
diff --git a/src/main/java/org/apache/xml/security/transforms/TransformationException.java b/src/main/java/org/apache/xml/security/transforms/TransformationException.java
index 2a08051..ac3c6d6 100644
--- a/src/main/java/org/apache/xml/security/transforms/TransformationException.java
+++ b/src/main/java/org/apache/xml/security/transforms/TransformationException.java
@@ -56,7 +56,7 @@
      * @param msgID
      * @param exArgs
      */
-    public TransformationException(String msgID, Object[] exArgs) {
+    public TransformationException(String msgID, Object exArgs[]) {
         super(msgID, exArgs);
     }
 
@@ -82,7 +82,7 @@
      * @param msgID
      * @param exArgs
      */
-    public TransformationException(Exception originalException, String msgID, Object[] exArgs) {
+    public TransformationException(Exception originalException, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
     }
 
diff --git a/src/main/java/org/apache/xml/security/transforms/Transforms.java b/src/main/java/org/apache/xml/security/transforms/Transforms.java
index 64aaabd..a7641b9 100644
--- a/src/main/java/org/apache/xml/security/transforms/Transforms.java
+++ b/src/main/java/org/apache/xml/security/transforms/Transforms.java
@@ -99,7 +99,7 @@
     private static final org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(Transforms.class);
 
-    private Element[] transformsElement;
+    private Element[] transforms;
 
     protected Transforms() { }
 
@@ -137,7 +137,7 @@
 
         if (numberOfTransformElems == 0) {
             // At least one Transform element must be present. Bad.
-            Object[] exArgs = { Constants._TAG_TRANSFORM, Constants._TAG_TRANSFORMS };
+            Object exArgs[] = { Constants._TAG_TRANSFORM, Constants._TAG_TRANSFORMS };
 
             throw new TransformationException("xml.WrongContent", exArgs);
         }
@@ -280,7 +280,7 @@
     private void checkSecureValidation(Transform transform) throws TransformationException {
         String uri = transform.getURI();
         if (secureValidation && Transforms.TRANSFORM_XSLT.equals(uri)) {
-            Object[] exArgs = { uri };
+            Object exArgs[] = { uri };
 
             throw new TransformationException(
                 "signature.Transform.ForbiddenTransform", exArgs
@@ -296,7 +296,7 @@
      */
     public int getLength() {
         initTransforms();
-        return transformsElement.length;
+        return transforms.length;
     }
 
     /**
@@ -310,15 +310,15 @@
     public Transform item(int i) throws TransformationException {
         try {
             initTransforms();
-            return new Transform(transformsElement[i], this.baseURI);
+            return new Transform(transforms[i], this.baseURI);
         } catch (XMLSecurityException ex) {
             throw new TransformationException(ex);
         }
     }
 
     private void initTransforms() {
-        if (transformsElement == null) {
-            transformsElement = XMLUtils.selectDsNodes(getFirstChild(), "Transform");
+        if (transforms == null) {
+            transforms = XMLUtils.selectDsNodes(getFirstChild(), "Transform");
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/FuncHere.java b/src/main/java/org/apache/xml/security/transforms/implementations/FuncHere.java
index e7fc9a6..1c6a7f7 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/FuncHere.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/FuncHere.java
@@ -139,7 +139,7 @@
      * @param vars
      * @param globalsSize
      */
-    public void fixupVariables(@SuppressWarnings("rawtypes") java.util.Vector vars, int globalsSize) { //NOPMD
+    public void fixupVariables(@SuppressWarnings("rawtypes") java.util.Vector vars, int globalsSize) {
         // do nothing
     }
 }
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/TransformBase64Decode.java b/src/main/java/org/apache/xml/security/transforms/implementations/TransformBase64Decode.java
index 11f72d2..9c1f965 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/TransformBase64Decode.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/TransformBase64Decode.java
@@ -143,7 +143,7 @@
             //Exceptional case there is current not text case testing this(Before it was a
             //a common case).
             Document doc =
-                XMLUtils.read(input.getOctetStream(), secureValidation);
+                XMLUtils.createDocumentBuilder(false, secureValidation).parse(input.getOctetStream());
 
             Element rootNode = doc.getDocumentElement();
             StringBuilder sb = new StringBuilder();
@@ -162,9 +162,11 @@
     void traverseElement(Element node, StringBuilder sb) {
         Node sibling = node.getFirstChild();
         while (sibling != null) {
-            if (Node.ELEMENT_NODE == sibling.getNodeType()) {
+            switch (sibling.getNodeType()) {
+            case Node.ELEMENT_NODE:
                 traverseElement((Element)sibling, sb);
-            } else if (Node.TEXT_NODE == sibling.getNodeType()) {
+                break;
+            case Node.TEXT_NODE:
                 sb.append(((Text)sibling).getData());
             }
             sibling = sibling.getNextSibling();
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath.java b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath.java
index a0bd74d..d6cd2a8 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath.java
@@ -87,7 +87,7 @@
                     transformObject.getElement().getFirstChild(), Constants._TAG_XPATH, 0);
 
             if (xpathElement == null) {
-                Object[] exArgs = { "ds:XPath", "Transform" };
+                Object exArgs[] = { "ds:XPath", "Transform" };
 
                 throw new TransformationException("xml.WrongContent", exArgs);
             }
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath2Filter.java b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath2Filter.java
index 9844670..20b8193 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath2Filter.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPath2Filter.java
@@ -90,7 +90,7 @@
                     XPath2FilterContainer._TAG_XPATH2
                 );
             if (xpathElements.length == 0) {
-                Object[] exArgs = { Transforms.TRANSFORM_XPATH2FILTER, "XPath" };
+                Object exArgs[] = { Transforms.TRANSFORM_XPATH2FILTER, "XPath" };
 
                 throw new TransformationException("xml.WrongContent", exArgs);
             }
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPointer.java b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPointer.java
index 7df5e8e..78ddc6f 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPointer.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXPointer.java
@@ -53,7 +53,7 @@
         XMLSignatureInput input, OutputStream os, Transform transformObject
     ) throws TransformationException {
 
-        Object[] exArgs = { implementedTransformURI };
+        Object exArgs[] = { implementedTransformURI };
 
         throw new TransformationException("signature.Transform.NotYetImplemented", exArgs);
     }
diff --git a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXSLT.java b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXSLT.java
index b2be495..370041b 100644
--- a/src/main/java/org/apache/xml/security/transforms/implementations/TransformXSLT.java
+++ b/src/main/java/org/apache/xml/security/transforms/implementations/TransformXSLT.java
@@ -85,7 +85,7 @@
                     XMLUtils.selectNode(transformElement.getFirstChild(), XSLTSpecNS, "transform", 0);
             }
             if (xsltElement == null) {
-                Object[] exArgs = { "xslt:stylesheet", "Transform" };
+                Object exArgs[] = { "xslt:stylesheet", "Transform" };
 
                 throw new TransformationException("xml.WrongContent", exArgs);
             }
diff --git a/src/main/java/org/apache/xml/security/transforms/params/InclusiveNamespaces.java b/src/main/java/org/apache/xml/security/transforms/params/InclusiveNamespaces.java
index e645b5e..a92ff74 100644
--- a/src/main/java/org/apache/xml/security/transforms/params/InclusiveNamespaces.java
+++ b/src/main/java/org/apache/xml/security/transforms/params/InclusiveNamespaces.java
@@ -72,7 +72,7 @@
         if (prefixes instanceof SortedSet<?>) {
             prefixList = (SortedSet<String>)prefixes;
         } else {
-            prefixList = new TreeSet<>(prefixes);
+            prefixList = new TreeSet<String>(prefixes);
         }
 
         StringBuilder sb = new StringBuilder();
@@ -81,7 +81,7 @@
                 sb.append("#default ");
             } else {
                 sb.append(prefix);
-                sb.append(' ');
+                sb.append(" ");
             }
         }
 
@@ -127,7 +127,7 @@
      * @return A set to string
      */
     public static SortedSet<String> prefixStr2Set(String inclusiveNamespaces) {
-        SortedSet<String> prefixes = new TreeSet<>();
+        SortedSet<String> prefixes = new TreeSet<String>();
 
         if (inclusiveNamespaces == null || inclusiveNamespaces.length() == 0) {
             return prefixes;
@@ -135,7 +135,7 @@
 
         String[] tokens = inclusiveNamespaces.split("\\s");
         for (String prefix : tokens) {
-            if ("#default".equals(prefix)) {
+            if (prefix.equals("#default")) {
                 prefixes.add("xmlns");
             } else {
                 prefixes.add(prefix);
diff --git a/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer.java b/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer.java
index bea6751..8079fa7 100644
--- a/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer.java
+++ b/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer.java
@@ -34,7 +34,7 @@
  *
  * @see <A HREF="http://www.w3.org/TR/xmldsig-filter2/">XPath Filter v2.0 (TR)</A>
  */
-public final class XPath2FilterContainer extends ElementProxy implements TransformParam {
+public class XPath2FilterContainer extends ElementProxy implements TransformParam {
 
     /** Field _ATT_FILTER */
     private static final String _ATT_FILTER = "Filter";
@@ -105,7 +105,7 @@
         if (!filterStr.equals(XPath2FilterContainer._ATT_FILTER_VALUE_INTERSECT)
             && !filterStr.equals(XPath2FilterContainer._ATT_FILTER_VALUE_SUBTRACT)
             && !filterStr.equals(XPath2FilterContainer._ATT_FILTER_VALUE_UNION)) {
-            Object[] exArgs = { XPath2FilterContainer._ATT_FILTER, filterStr,
+            Object exArgs[] = { XPath2FilterContainer._ATT_FILTER, filterStr,
                                 XPath2FilterContainer._ATT_FILTER_VALUE_INTERSECT
                                 + ", "
                                 + XPath2FilterContainer._ATT_FILTER_VALUE_SUBTRACT
diff --git a/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer04.java b/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer04.java
index 21e6350..82b208d 100644
--- a/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer04.java
+++ b/src/main/java/org/apache/xml/security/transforms/params/XPath2FilterContainer04.java
@@ -31,7 +31,7 @@
  *
  * @see <A HREF="http://www.w3.org/TR/xmldsig-filter2/">XPath Filter v2.0 (TR)</A>
  */
-public final class XPath2FilterContainer04 extends ElementProxy implements TransformParam {
+public class XPath2FilterContainer04 extends ElementProxy implements TransformParam {
 
     /** Field _ATT_FILTER */
     private static final String _ATT_FILTER = "Filter";
@@ -100,7 +100,7 @@
         if (!filterStr.equals(XPath2FilterContainer04._ATT_FILTER_VALUE_INTERSECT)
             && !filterStr.equals(XPath2FilterContainer04._ATT_FILTER_VALUE_SUBTRACT)
             && !filterStr.equals(XPath2FilterContainer04._ATT_FILTER_VALUE_UNION)) {
-            Object[] exArgs = { XPath2FilterContainer04._ATT_FILTER, filterStr,
+            Object exArgs[] = { XPath2FilterContainer04._ATT_FILTER, filterStr,
                                 XPath2FilterContainer04._ATT_FILTER_VALUE_INTERSECT
                                 + ", "
                                 + XPath2FilterContainer04._ATT_FILTER_VALUE_SUBTRACT
diff --git a/src/main/java/org/apache/xml/security/transforms/params/XPathFilterCHGPContainer.java b/src/main/java/org/apache/xml/security/transforms/params/XPathFilterCHGPContainer.java
index 4782b0f..ae58bbc 100644
--- a/src/main/java/org/apache/xml/security/transforms/params/XPathFilterCHGPContainer.java
+++ b/src/main/java/org/apache/xml/security/transforms/params/XPathFilterCHGPContainer.java
@@ -33,7 +33,7 @@
  * than the xfilter2.
  *
  */
-public final class XPathFilterCHGPContainer extends ElementProxy implements TransformParam {
+public class XPathFilterCHGPContainer extends ElementProxy implements TransformParam {
 
     public static final String TRANSFORM_XPATHFILTERCHGP =
         "http://www.nue.et-inf.uni-siegen.de/~geuer-pollmann/#xpathFilter";
@@ -237,7 +237,7 @@
      * @return the string
      */
     public boolean getIncludeSlashPolicy() {
-        return "true".equals(getLocalAttribute(XPathFilterCHGPContainer._ATT_INCLUDESLASH));
+        return getLocalAttribute(XPathFilterCHGPContainer._ATT_INCLUDESLASH).equals("true");
     }
 
     /**
diff --git a/src/main/java/org/apache/xml/security/utils/Base64.java b/src/main/java/org/apache/xml/security/utils/Base64.java
index 9f9b4bf..ceb5e7d 100644
--- a/src/main/java/org/apache/xml/security/utils/Base64.java
+++ b/src/main/java/org/apache/xml/security/utils/Base64.java
@@ -39,7 +39,7 @@
  * @see org.apache.xml.security.transforms.implementations.TransformBase64Decode
  */
 @Deprecated
-public final class Base64 {
+public class Base64 {
 
     /** Field BASE64DEFAULTLENGTH */
     public static final int BASE64DEFAULTLENGTH = 76;
@@ -373,12 +373,12 @@
             return "";
         }
 
-        long fewerThan24bits = lengthDataBits % (TWENTYFOURBITGROUP);
+        long fewerThan24bits = lengthDataBits % ((long) TWENTYFOURBITGROUP);
         int numberTriplets = (int) (lengthDataBits / TWENTYFOURBITGROUP);
         int numberQuartet = fewerThan24bits != 0L ? numberTriplets + 1 : numberTriplets;
         int quartesPerLine = length / 4;
         int numberLines = (numberQuartet - 1) / quartesPerLine;
-        char[] encodedData = null;
+        char encodedData[] = null;
 
         encodedData = new char[numberQuartet * 4 + numberLines * 2];
 
@@ -509,7 +509,7 @@
             return new byte[0];
         }
 
-        byte[] decodedData = null;
+        byte decodedData[] = null;
         byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
 
         int i = 0;
@@ -624,7 +624,7 @@
             return;
         }
 
-        //byte[] decodedData = null;
+        //byte decodedData[] = null;
         byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
 
         int i = 0;
@@ -691,7 +691,7 @@
      */
     public static final void decode(InputStream is, OutputStream os)
         throws Base64DecodingException, IOException {
-        //byte[] decodedData = null;
+        //byte decodedData[] = null;
         byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
 
         int index = 0;
diff --git a/src/main/java/org/apache/xml/security/utils/ClassLoaderUtils.java b/src/main/java/org/apache/xml/security/utils/ClassLoaderUtils.java
index abffe8e..3534d46 100644
--- a/src/main/java/org/apache/xml/security/utils/ClassLoaderUtils.java
+++ b/src/main/java/org/apache/xml/security/utils/ClassLoaderUtils.java
@@ -54,7 +54,7 @@
      */
     public static URL getResource(String resourceName, Class<?> callingClass) {
         URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
-        if (url == null && resourceName.charAt(0) == '/') {
+        if (url == null && resourceName.startsWith("/")) {
             //certain classloaders need it without the leading /
             url =
                 Thread.currentThread().getContextClassLoader().getResource(
@@ -69,7 +69,7 @@
         if (url == null) {
             url = cluClassloader.getResource(resourceName);
         }
-        if (url == null && resourceName.charAt(0) == '/') {
+        if (url == null && resourceName.startsWith("/")) {
             //certain classloaders need it without the leading /
             url = cluClassloader.getResource(resourceName.substring(1));
         }
@@ -122,7 +122,7 @@
             LOG.debug(e.getMessage(), e);
             //ignore
         }
-        if (!urls.hasMoreElements() && resourceName.charAt(0) == '/') {
+        if (!urls.hasMoreElements() && resourceName.startsWith("/")) {
             //certain classloaders need it without the leading /
             try {
                 urls =
@@ -147,7 +147,7 @@
                 // ignore
             }
         }
-        if (!urls.hasMoreElements() && resourceName.charAt(0) == '/') {
+        if (!urls.hasMoreElements() && resourceName.startsWith("/")) {
             //certain classloaders need it without the leading /
             try {
                 urls = cluClassloader.getResources(resourceName.substring(1));
diff --git a/src/main/java/org/apache/xml/security/utils/ElementProxy.java b/src/main/java/org/apache/xml/security/utils/ElementProxy.java
index 5b02f05..31368da 100644
--- a/src/main/java/org/apache/xml/security/utils/ElementProxy.java
+++ b/src/main/java/org/apache/xml/security/utils/ElementProxy.java
@@ -51,7 +51,7 @@
     private Document wrappedDoc;
 
     /** Field prefixMappings */
-    private static Map<String, String> prefixMappings = new ConcurrentHashMap<>();
+    private static Map<String, String> prefixMappings = new ConcurrentHashMap<String, String>();
 
     /**
      * Constructor ElementProxy
@@ -245,7 +245,7 @@
 
         if(!expectedNamespaceUri.equals(actualNamespaceUri)
             && !expectedLocalName.equals(actualLocalName)) {
-            Object[] exArgs = { actualNamespaceUri + ":" + actualLocalName,
+            Object exArgs[] = { actualNamespaceUri + ":" + actualLocalName,
                                 expectedNamespaceUri + ":" + expectedLocalName};
             throw new XMLSecurityException("xml.WrongElement", exArgs);
         }
@@ -455,7 +455,7 @@
 
         if (a != null) {
             if (!a.getNodeValue().equals(uri)) {
-                Object[] exArgs = { ns, getElement().getAttributeNS(null, ns) };
+                Object exArgs[] = { ns, getElement().getAttributeNS(null, ns) };
 
                 throw new XMLSecurityException("namespacePrefixAlreadyUsedByOtherURI", exArgs);
             }
@@ -485,7 +485,7 @@
         if (prefixMappings.containsValue(prefix)) {
             String storedPrefix = prefixMappings.get(namespace);
             if (!storedPrefix.equals(prefix)) {
-                Object[] exArgs = { prefix, namespace, storedPrefix };
+                Object exArgs[] = { prefix, namespace, storedPrefix };
 
                 throw new XMLSecurityException("prefix.AlreadyAssigned", exArgs);
             }
diff --git a/src/main/java/org/apache/xml/security/utils/I18n.java b/src/main/java/org/apache/xml/security/utils/I18n.java
index c9bb1b6..8585278 100644
--- a/src/main/java/org/apache/xml/security/utils/I18n.java
+++ b/src/main/java/org/apache/xml/security/utils/I18n.java
@@ -26,7 +26,7 @@
  * The Internationalization (I18N) pack.
  *
  */
-public final class I18n {
+public class I18n {
 
     /** Field NOT_INITIALIZED_MSG */
     public static final String NOT_INITIALIZED_MSG =
@@ -107,7 +107,7 @@
      */
     public static String getExceptionMessage(String msgID, Exception originalException) {
         try {
-            Object[] exArgs = { originalException.getMessage() };
+            Object exArgs[] = { originalException.getMessage() };
             return MessageFormat.format(resourceBundle.getString(msgID), exArgs);
         } catch (Throwable t) {
             if (org.apache.xml.security.Init.isInitialized()) {
@@ -129,7 +129,7 @@
      * @param exArgs
      * @return message translated
      */
-    public static String getExceptionMessage(String msgID, Object[] exArgs) {
+    public static String getExceptionMessage(String msgID, Object exArgs[]) {
         try {
             return MessageFormat.format(resourceBundle.getString(msgID), exArgs);
         } catch (Throwable t) {
diff --git a/src/main/java/org/apache/xml/security/utils/IdResolver.java b/src/main/java/org/apache/xml/security/utils/IdResolver.java
index 6787d72..34b7f63 100644
--- a/src/main/java/org/apache/xml/security/utils/IdResolver.java
+++ b/src/main/java/org/apache/xml/security/utils/IdResolver.java
@@ -30,7 +30,7 @@
  * @deprecated
  */
 @Deprecated
-public final class IdResolver {
+public class IdResolver {
 
     private IdResolver() {
         // we don't allow instantiation
diff --git a/src/main/java/org/apache/xml/security/utils/JavaUtils.java b/src/main/java/org/apache/xml/security/utils/JavaUtils.java
index cde9669..a7ca00d 100644
--- a/src/main/java/org/apache/xml/security/utils/JavaUtils.java
+++ b/src/main/java/org/apache/xml/security/utils/JavaUtils.java
@@ -53,11 +53,11 @@
     public static byte[] getBytesFromFile(String fileName)
         throws FileNotFoundException, IOException {
 
-        byte[] refBytes = null;
+        byte refBytes[] = null;
 
         try (InputStream inputStream = Files.newInputStream(Paths.get(fileName));
             UnsyncByteArrayOutputStream baos = new UnsyncByteArrayOutputStream()) {
-            byte[] buf = new byte[1024];
+            byte buf[] = new byte[1024];
             int len;
 
             while ((len = inputStream.read(buf)) > 0) {
@@ -100,7 +100,7 @@
      */
     public static byte[] getBytesFromStream(InputStream inputStream) throws IOException {
         try (UnsyncByteArrayOutputStream baos = new UnsyncByteArrayOutputStream()) {
-            byte[] buf = new byte[4 * 1024];
+            byte buf[] = new byte[4 * 1024];
             int len;
             while ((len = inputStream.read(buf)) > 0) {
                 baos.write(buf, 0, len);
diff --git a/src/main/java/org/apache/xml/security/utils/RFC2253Parser.java b/src/main/java/org/apache/xml/security/utils/RFC2253Parser.java
index 83e9692..4100648 100644
--- a/src/main/java/org/apache/xml/security/utils/RFC2253Parser.java
+++ b/src/main/java/org/apache/xml/security/utils/RFC2253Parser.java
@@ -68,7 +68,7 @@
      */
     public static String normalize(String dn, boolean toXml) {
         //if empty string
-        if (dn == null || dn.isEmpty()) {
+        if (dn == null || dn.equals("")) {
             return "";
         }
 
@@ -84,7 +84,7 @@
                 l += countQuotes(DN, j, k);
 
                 if (k > 0 && DN.charAt(k - 1) != '\\' && (l % 2) == 0) {
-                    sb.append(parseRDN(DN.substring(i, k).trim(), toXml)).append(',');
+                    sb.append(parseRDN(DN.substring(i, k).trim(), toXml)).append(",");
 
                     i = k + 1;
                     l = 0;
@@ -117,7 +117,7 @@
             l += countQuotes(str, j, k);
 
             if (k > 0 && str.charAt(k - 1) != '\\' && (l % 2) == 0) {
-                sb.append(parseATAV(trim(str.substring(i, k)), toXml)).append('+');
+                sb.append(parseATAV(trim(str.substring(i, k)), toXml)).append("+");
 
                 i = k + 1;
                 l = 0;
@@ -206,7 +206,7 @@
         }
 
         if (toXml) {
-            if (value.length() > 0 && value.charAt(0) == '#') {
+            if (value.startsWith("#")) {
                 value = '\\' + value;
             }
         } else {
diff --git a/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayInputStream.java b/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayInputStream.java
index ff6cd1e..4782e91 100644
--- a/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayInputStream.java
+++ b/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayInputStream.java
@@ -55,7 +55,7 @@
      * @param buf
      *            the byte array to stream over.
      */
-    public UnsyncByteArrayInputStream(byte[] buf) {
+    public UnsyncByteArrayInputStream(byte buf[]) {
         this.mark = 0;
         this.buf = buf;
         this.count = buf.length;
@@ -73,7 +73,7 @@
      * @param length
      *            the number of bytes available for streaming.
      */
-    public UnsyncByteArrayInputStream(byte[] buf, int offset, int length) {
+    public UnsyncByteArrayInputStream(byte buf[], int offset, int length) {
         this.buf = buf;
         pos = offset;
         mark = offset;
@@ -166,7 +166,7 @@
      *             if {@code b} is {@code null}.
      */
     @Override
-    public int read(byte[] b, int offset, int length) {
+    public int read(byte b[], int offset, int length) {
         if (b == null) {
             throw new NullPointerException();
         }
diff --git a/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java b/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java
index d6ff16e..f70feba 100644
--- a/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java
+++ b/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java
@@ -76,7 +76,7 @@
     }
 
     public byte[] toByteArray() {
-        byte[] result = new byte[pos];
+        byte result[] = new byte[pos];
         System.arraycopy(buf, 0, result, 0, pos);
         return result;
     }
@@ -107,7 +107,7 @@
                 newSize = VM_ARRAY_INDEX_MAX_VALUE;
             }
         }
-        byte[] newBuf = new byte[newSize];
+        byte newBuf[] = new byte[newSize];
         System.arraycopy(buf, 0, newBuf, 0, pos);
         buf = newBuf;
         size = newSize;
diff --git a/src/main/java/org/apache/xml/security/utils/WeakObjectPool.java b/src/main/java/org/apache/xml/security/utils/WeakObjectPool.java
index adf3dba..967da95 100644
--- a/src/main/java/org/apache/xml/security/utils/WeakObjectPool.java
+++ b/src/main/java/org/apache/xml/security/utils/WeakObjectPool.java
@@ -56,7 +56,7 @@
     protected WeakObjectPool() {
         //alternative implementations: ArrayBlockingQueue has a fixed size
         //  PriorityBlockingQueue: requires a dummy comparator; less memory but more overhead
-        available = new LinkedBlockingDeque<>();
+        available = new LinkedBlockingDeque<WeakReference<T>>();
         this.onLoan = Collections.synchronizedMap(new WeakHashMap<T, Integer>());
     }
 
diff --git a/src/main/java/org/apache/xml/security/utils/XMLUtils.java b/src/main/java/org/apache/xml/security/utils/XMLUtils.java
index b70aab3..1eb48f6 100644
--- a/src/main/java/org/apache/xml/security/utils/XMLUtils.java
+++ b/src/main/java/org/apache/xml/security/utils/XMLUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.utils;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -35,17 +36,21 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.validation.Schema;
 
 import org.apache.xml.security.c14n.CanonicalizationException;
 import org.apache.xml.security.c14n.Canonicalizer;
 import org.apache.xml.security.c14n.InvalidCanonicalizerException;
 import org.w3c.dom.Attr;
+import org.w3c.dom.DOMImplementation;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -60,10 +65,12 @@
             (PrivilegedAction<Boolean>) () -> Boolean.getBoolean("org.apache.xml.security.ignoreLineBreaks"));
 
     @SuppressWarnings("unchecked")
-    private static final WeakObjectPool<DocumentBuilder, ParserConfigurationException> pools[] = new WeakObjectPool[2];
+    private static final WeakObjectPool<DocumentBuilder, ParserConfigurationException> pools[] = new WeakObjectPool[4];
     static {
-        pools[0] = new DocumentBuilderPool(false);
-        pools[1] = new DocumentBuilderPool(true);
+        pools[0] = new DocumentBuilderPool(false, false);
+        pools[1] = new DocumentBuilderPool(false, true);
+        pools[2] = new DocumentBuilderPool(true, false);
+        pools[3] = new DocumentBuilderPool(true, true);
     }
 
     private static volatile String dsPrefix = "ds";
@@ -154,7 +161,7 @@
         if (rootNode == exclude) {
             return;
         }
-        switch (rootNode.getNodeType()) { //NOPMD
+        switch (rootNode.getNodeType()) {
         case Node.ELEMENT_NODE:
             result.add(rootNode);
             Element el = (Element)rootNode;
@@ -179,14 +186,14 @@
                 }
                 getSetRec(r, result, exclude, com);
             }
-            break;
+            return;
         case Node.COMMENT_NODE:
             if (com) {
                 result.add(rootNode);
             }
-            break;
+            return;
         case Node.DOCUMENT_TYPE_NODE:
-            break;
+            return;
         default:
             result.add(rootNode);
         }
@@ -261,6 +268,11 @@
         }
     }
 
+    @Deprecated
+    public static String getFullTextChildrenFromElement(Element element) {
+        return getFullTextChildrenFromNode(element);
+    }
+
     /**
      * Method getFullTextChildrenFromNode
      *
@@ -719,6 +731,62 @@
         return null;
     }
 
+
+    /**
+     * @param sibling
+     * @param nodeName
+     * @param number
+     * @return nodes with the constrain
+     */
+    public static Text selectDsNodeText(Node sibling, String nodeName, int number) {
+        Node n = selectDsNode(sibling, nodeName, number);
+        if (n == null) {
+            return null;
+        }
+        n = n.getFirstChild();
+        while (n != null && n.getNodeType() != Node.TEXT_NODE) {
+            n = n.getNextSibling();
+        }
+        return (Text)n;
+    }
+
+    /**
+     * @param sibling
+     * @param nodeName
+     * @param number
+     * @return nodes with the constrain
+     */
+    public static Text selectDs11NodeText(Node sibling, String nodeName, int number) {
+        Node n = selectDs11Node(sibling, nodeName, number);
+        if (n == null) {
+            return null;
+        }
+        n = n.getFirstChild();
+        while (n != null && n.getNodeType() != Node.TEXT_NODE) {
+            n = n.getNextSibling();
+        }
+        return (Text)n;
+    }
+
+    /**
+     * @param sibling
+     * @param uri
+     * @param nodeName
+     * @param number
+     * @return nodes with the constrain
+     */
+    public static Text selectNodeText(Node sibling, String uri, String nodeName, int number) {
+        Node n = selectNode(sibling, uri, nodeName, number);
+        if (n == null) {
+            return null;
+        }
+        n = n.getFirstChild();
+        while (n != null && n.getNodeType() != Node.TEXT_NODE) {
+            n = n.getNextSibling();
+        }
+        return (Text)n;
+    }
+
     /**
      * @param sibling
      * @param uri
@@ -1003,55 +1071,31 @@
         return true;
     }
 
-    public static Document newDocument() throws ParserConfigurationException {
-        DocumentBuilder documentBuilder = createDocumentBuilder(true);
-        Document doc = documentBuilder.newDocument();
-        repoolDocumentBuilder(documentBuilder, true);
-        return doc;
+    public static DocumentBuilder createDocumentBuilder(boolean validating) throws ParserConfigurationException {
+        return createDocumentBuilder(validating, true);
     }
 
-    public static Document read(InputStream inputStream) throws ParserConfigurationException, SAXException, IOException {
-        return read(inputStream, true);
-    }
-
-    public static Document read(InputStream inputStream, boolean disAllowDocTypeDeclarations) throws ParserConfigurationException, SAXException, IOException {
-        DocumentBuilder documentBuilder = createDocumentBuilder(disAllowDocTypeDeclarations);
-        Document doc = documentBuilder.parse(inputStream);
-        repoolDocumentBuilder(documentBuilder, disAllowDocTypeDeclarations);
-        return doc;
-    }
-
-    public static Document read(String uri, boolean disAllowDocTypeDeclarations)
-        throws ParserConfigurationException, SAXException, IOException {
-        DocumentBuilder documentBuilder = createDocumentBuilder(disAllowDocTypeDeclarations);
-        Document doc = documentBuilder.parse(uri);
-        repoolDocumentBuilder(documentBuilder, disAllowDocTypeDeclarations);
-        return doc;
-    }
-
-    public static Document read(InputSource inputSource) throws ParserConfigurationException, SAXException, IOException {
-        return read(inputSource, true);
-    }
-
-    public static Document read(InputSource inputSource, boolean disAllowDocTypeDeclarations)
-        throws ParserConfigurationException, SAXException, IOException {
-        DocumentBuilder documentBuilder = createDocumentBuilder(disAllowDocTypeDeclarations);
-        Document doc = documentBuilder.parse(inputSource);
-        repoolDocumentBuilder(documentBuilder, disAllowDocTypeDeclarations);
-        return doc;
-    }
-
-    private static DocumentBuilder createDocumentBuilder(
-        boolean disAllowDocTypeDeclarations
+    public static DocumentBuilder createDocumentBuilder(
+        boolean validating, boolean disAllowDocTypeDeclarations
     ) throws ParserConfigurationException {
-        int idx = getPoolsIndex(disAllowDocTypeDeclarations);
+        int idx = getPoolsIndex(validating, disAllowDocTypeDeclarations);
         return pools[idx].getObject();
     }
 
 
-    private static boolean repoolDocumentBuilder(DocumentBuilder db, boolean disAllowDocTypeDeclarations) {
+    /**
+     * Return this document builder to be reused
+     * @param db DocumentBuilder returned from any of {@link #createDocumentBuilder} methods.
+     * @return whether it was successfully returned to the pool
+     */
+    public static boolean repoolDocumentBuilder(DocumentBuilder db) {
+        if (!(db instanceof DocumentBuilderProxy)) {
+            return false;
+        }
         db.reset();
-        int idx = getPoolsIndex(disAllowDocTypeDeclarations);
+        boolean disAllowDocTypeDeclarations =
+            ((DocumentBuilderProxy)db).disAllowDocTypeDeclarations();
+        int idx = getPoolsIndex(db.isValidating(), disAllowDocTypeDeclarations);
         return pools[idx].repool(db);
     }
 
@@ -1100,12 +1144,97 @@
         return resizedBytes;
     }
 
+    /**
+     * We need this proxy wrapping DocumentBuilder to record the value
+     * passed to disAllowDoctypeDeclarations.  It's needed to figure out
+     * on which pool to return.
+     */
+    private static class DocumentBuilderProxy extends DocumentBuilder {
+        private final DocumentBuilder delegate;
+        private final boolean disAllowDocTypeDeclarations;
+
+        private DocumentBuilderProxy(DocumentBuilder actual, boolean disAllowDocTypeDeclarations) {
+            delegate = actual;
+            this.disAllowDocTypeDeclarations = disAllowDocTypeDeclarations;
+        }
+
+        boolean disAllowDocTypeDeclarations() {
+            return disAllowDocTypeDeclarations;
+        }
+
+        public void reset() {
+            delegate.reset();
+        }
+
+        public Document parse(InputStream is) throws SAXException, IOException {
+            return delegate.parse(is);
+        }
+
+        public Document parse(InputStream is, String systemId)
+                throws SAXException, IOException {
+            return delegate.parse(is, systemId);
+        }
+
+        public Document parse(String uri) throws SAXException, IOException {
+            return delegate.parse(uri);
+        }
+
+        public Document parse(File f) throws SAXException, IOException {
+            return delegate.parse(f);
+        }
+
+        public Schema getSchema() {
+            return delegate.getSchema();
+        }
+
+        public boolean isXIncludeAware() {
+            return delegate.isXIncludeAware();
+        }
+
+        @Override
+        public Document parse(InputSource is) throws SAXException, IOException {
+            return delegate.parse(is);
+        }
+
+        @Override
+        public boolean isNamespaceAware() {
+            return delegate.isNamespaceAware();
+        }
+
+        @Override
+        public boolean isValidating() {
+            return delegate.isValidating();
+        }
+
+        @Override
+        public void setEntityResolver(EntityResolver er) {
+            delegate.setEntityResolver(er);
+        }
+
+        @Override
+        public void setErrorHandler(ErrorHandler eh) {
+            delegate.setErrorHandler(eh);
+        }
+
+        @Override
+        public Document newDocument() {
+            return delegate.newDocument();
+        }
+
+        @Override
+        public DOMImplementation getDOMImplementation() {
+            return delegate.getDOMImplementation();
+        }
+
+    }
+
     private static final class DocumentBuilderPool
         extends WeakObjectPool<DocumentBuilder, ParserConfigurationException> {
 
-        private final boolean disAllowDocTypeDeclarations;
+        private final boolean validating, disAllowDocTypeDeclarations;
 
-        public DocumentBuilderPool(boolean disAllowDocTypeDeclarations) {
+        public DocumentBuilderPool(boolean validating, boolean disAllowDocTypeDeclarations) {
+            this.validating = validating;
             this.disAllowDocTypeDeclarations = disAllowDocTypeDeclarations;
         }
 
@@ -1116,18 +1245,20 @@
             if (disAllowDocTypeDeclarations) {
                 dfactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
             }
+            dfactory.setValidating(validating);
             dfactory.setNamespaceAware(true);
-            return dfactory.newDocumentBuilder();
+            return new DocumentBuilderProxy(dfactory.newDocumentBuilder(), disAllowDocTypeDeclarations);
         }
     }
 
     /**
-     * Maps the boolean configuration options for the factories to the array index for the WeakObjectPool
+     * Maps the two boolean configuration options for the factories to the array index for the WeakObjectPool
+     * @param validating
      * @param disAllowDocTypeDeclarations
      * @return the index to the {@link #pools}
      */
-    private static int getPoolsIndex(boolean disAllowDocTypeDeclarations) {
-        return disAllowDocTypeDeclarations ? 1 : 0;
+    private static int getPoolsIndex(boolean validating, boolean disAllowDocTypeDeclarations) {
+        return (validating ? 2 : 0) + (disAllowDocTypeDeclarations ? 1 : 0);
     }
 
 }
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolver.java b/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolver.java
index 31204b1..ba42dd2 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolver.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolver.java
@@ -97,7 +97,7 @@
                     if (context.secureValidation
                         && (resolverTmp.resolverSpi instanceof ResolverLocalFilesystem
                             || resolverTmp.resolverSpi instanceof ResolverDirectHTTP)) {
-                        Object[] exArgs = { resolverTmp.resolverSpi.getClass().getName() };
+                        Object exArgs[] = { resolverTmp.resolverSpi.getClass().getName() };
                         throw new ResourceResolverException(
                             "signature.Reference.ForbiddenResolver", exArgs, context.uriToResolve, context.baseUri
                         );
@@ -107,7 +107,7 @@
             }
         }
 
-        Object[] exArgs = { context.uriToResolve != null
+        Object exArgs[] = { context.uriToResolve != null
                 ? context.uriToResolve : "null", context.baseUri };
 
         throw new ResourceResolverException("utils.resolver.noClass", exArgs, context.uriToResolve, context.baseUri);
@@ -145,7 +145,7 @@
     ) throws ResourceResolverException {
         LOG.debug(
             "I was asked to create a ResourceResolver and got {}",
-            individualResolvers == null ? 0 : individualResolvers.size()
+            (individualResolvers == null ? 0 : individualResolvers.size())
         );
 
         ResourceResolverContext context = new ResourceResolverContext(uri, baseURI, secureValidation);
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolverException.java b/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolverException.java
index b302efd..34d43b1 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolverException.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/ResourceResolverException.java
@@ -55,7 +55,7 @@
      * @param uri
      * @param baseURI
      */
-    public ResourceResolverException(String msgID, Object[] exArgs, String uri,
+    public ResourceResolverException(String msgID, Object exArgs[], String uri,
                                      String baseURI) {
         super(msgID, exArgs);
 
@@ -95,7 +95,7 @@
      * @param exArgs
      */
     public ResourceResolverException(Exception originalException, String uri,
-                                     String baseURI, String msgID, Object[] exArgs) {
+                                     String baseURI, String msgID, Object exArgs[]) {
         super(originalException, msgID, exArgs);
 
         this.uri = uri;
@@ -103,7 +103,7 @@
     }
 
     @Deprecated
-    public ResourceResolverException(String msgID, Object[] exArgs,
+    public ResourceResolverException(String msgID, Object exArgs[],
                                      Exception originalException, String uri,
                                      String baseURI) {
         this(originalException, uri, baseURI, msgID, exArgs);
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverAnonymous.java b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverAnonymous.java
index ad7c779..df3fe3f 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverAnonymous.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverAnonymous.java
@@ -69,7 +69,10 @@
      */
     @Override
     public boolean engineCanResolveURI(ResourceResolverContext context) {
-        return context.uriToResolve == null;
+        if (context.uriToResolve == null) {
+            return true;
+        }
+        return false;
     }
 
     /** {@inheritDoc} */
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverDirectHTTP.java b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverDirectHTTP.java
index 6bdc29f..a2d88c9 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverDirectHTTP.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverDirectHTTP.java
@@ -62,7 +62,7 @@
         org.slf4j.LoggerFactory.getLogger(ResolverDirectHTTP.class);
 
     /** Field properties[] */
-    private static final String[] properties = {
+    private static final String properties[] = {
                                                  "http.proxy.host", "http.proxy.port",
                                                  "http.proxy.username", "http.proxy.password",
                                                  "http.basic.username", "http.basic.password"
@@ -206,7 +206,7 @@
             return false;
         }
 
-        if (context.uriToResolve.isEmpty() || context.uriToResolve.charAt(0) == '#') {
+        if (context.uriToResolve.equals("") || context.uriToResolve.charAt(0) == '#') {
             LOG.debug("quick fail for empty URIs and local ones");
             return false;
         }
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverFragment.java b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverFragment.java
index 1c26e5b..3f4b71a 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverFragment.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverFragment.java
@@ -54,7 +54,7 @@
         Document doc = context.attr.getOwnerElement().getOwnerDocument();
 
         Node selectedElem = null;
-        if (context.uriToResolve.isEmpty()) {
+        if (context.uriToResolve.equals("")) {
             /*
              * Identifies the node-set (minus any comment nodes) of the XML
              * resource containing the signature
@@ -74,7 +74,7 @@
 
             selectedElem = doc.getElementById(id);
             if (selectedElem == null) {
-                Object[] exArgs = { id };
+                Object exArgs[] = { id };
                 throw new ResourceResolverException(
                     "signature.Verification.MissingID", exArgs, context.uriToResolve, context.baseUri
                 );
@@ -82,7 +82,7 @@
             if (context.secureValidation) {
                 Element start = context.attr.getOwnerDocument().getDocumentElement();
                 if (!XMLUtils.protectAgainstWrappingAttack(start, id)) {
-                    Object[] exArgs = { id };
+                    Object exArgs[] = { id };
                     throw new ResourceResolverException(
                         "signature.Verification.MultipleIDs", exArgs, context.uriToResolve, context.baseUri
                     );
@@ -117,7 +117,7 @@
             return false;
         }
 
-        if (context.uriToResolve.isEmpty() ||
+        if (context.uriToResolve.equals("") ||
             context.uriToResolve.charAt(0) == '#' && !context.uriToResolve.startsWith("#xpointer(")
         ) {
             LOG.debug("State I can resolve reference: \"{}\"", context.uriToResolve);
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverLocalFilesystem.java b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverLocalFilesystem.java
index fc03ec5..1d71444 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverLocalFilesystem.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverLocalFilesystem.java
@@ -111,7 +111,7 @@
             return false;
         }
 
-        if (context.uriToResolve.isEmpty() || context.uriToResolve.charAt(0) == '#' ||
+        if (context.uriToResolve.equals("") || context.uriToResolve.charAt(0) == '#' ||
             context.uriToResolve.startsWith("http:")) {
             return false;
         }
diff --git a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverXPointer.java b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverXPointer.java
index eae8d1b..2aa8982 100644
--- a/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverXPointer.java
+++ b/src/main/java/org/apache/xml/security/utils/resolver/implementations/ResolverXPointer.java
@@ -73,7 +73,7 @@
             if (context.secureValidation) {
                 Element start = context.attr.getOwnerDocument().getDocumentElement();
                 if (!XMLUtils.protectAgainstWrappingAttack(start, id)) {
-                    Object[] exArgs = { id };
+                    Object exArgs[] = { id };
                     throw new ResourceResolverException(
                         "signature.Verification.MultipleIDs", exArgs, context.uriToResolve, context.baseUri
                     );
@@ -81,7 +81,7 @@
             }
 
             if (resultNode == null) {
-                Object[] exArgs = { id };
+                Object exArgs[] = { id };
 
                 throw new ResourceResolverException(
                     "signature.Verification.MissingID", exArgs, context.uriToResolve, context.baseUri
@@ -109,7 +109,11 @@
         if (context.uriToResolve == null) {
             return false;
         }
-        return isXPointerSlash(context.uriToResolve) || isXPointerId(context.uriToResolve);
+        if (isXPointerSlash(context.uriToResolve) || isXPointerId(context.uriToResolve)) {
+            return true;
+        }
+
+        return false;
     }
 
     /**
@@ -119,7 +123,11 @@
      * @return true if begins with xpointer
      */
     private static boolean isXPointerSlash(String uri) {
-        return "#xpointer(/)".equals(uri);
+        if (uri.equals("#xpointer(/)")) {
+            return true;
+        }
+
+        return false;
     }
 
     /**
diff --git a/src/test/java/javax/xml/crypto/test/KeySelectorExceptionTest.java b/src/test/java/javax/xml/crypto/test/KeySelectorExceptionTest.java
index c51011d..c3e5005 100644
--- a/src/test/java/javax/xml/crypto/test/KeySelectorExceptionTest.java
+++ b/src/test/java/javax/xml/crypto/test/KeySelectorExceptionTest.java
@@ -21,17 +21,13 @@
  */
 package javax.xml.crypto.test;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 import java.util.Arrays;
 import javax.xml.crypto.KeySelectorException;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
 /**
  * Unit test for javax.xml.crypto.KeySelectorException
  *
@@ -90,4 +86,4 @@
         }
         return result;
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/KeySelectorTest.java b/src/test/java/javax/xml/crypto/test/KeySelectorTest.java
index 6aedeb6..39e166d 100644
--- a/src/test/java/javax/xml/crypto/test/KeySelectorTest.java
+++ b/src/test/java/javax/xml/crypto/test/KeySelectorTest.java
@@ -23,6 +23,7 @@
 
 import java.util.*;
 
+import static org.junit.Assert.assertTrue;
 
 import java.security.Key;
 import java.security.cert.X509Certificate;
@@ -30,8 +31,6 @@
 import javax.xml.crypto.dsig.keyinfo.*;
 import javax.xml.crypto.dsig.*;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * Unit test for javax.xml.crypto.KeySelector
  *
@@ -98,4 +97,4 @@
         }
         return result;
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/KeySelectors.java b/src/test/java/javax/xml/crypto/test/KeySelectors.java
index 2f3d774..e4b75cd 100644
--- a/src/test/java/javax/xml/crypto/test/KeySelectors.java
+++ b/src/test/java/javax/xml/crypto/test/KeySelectors.java
@@ -234,7 +234,7 @@
                 case MATCH_SUBJECT_KEY_ID:
                     byte[] extension = c.getExtensionValue("2.5.29.14");
                     if (extension != null) {
-                        byte[] extVal = new byte[extension.length - 4];
+                        byte extVal[] = new byte[extension.length - 4];
                         System.arraycopy(extension, 4, extVal, 0, extVal.length);
 
                         if (Arrays.equals(extVal, (byte[]) value)) {
@@ -281,13 +281,13 @@
                             // assume KeyName contains subject DN and search
                             // collection of certs for match
                             List<X509Certificate> result = match(MATCH_SUBJECT, name, certs);
-                            int numOfMatches = result == null ? 0 : result.size();
+                            int numOfMatches = (result == null? 0 : result.size());
                             if (numOfMatches != 1) {
                                 throw new KeySelectorException
                                     ((numOfMatches == 0 ? "No":"More than one") +
                                      " match found");
                             }
-                            pk = result.get(0).getPublicKey();
+                            pk = ((X509Certificate)result.get(0)).getPublicKey();
                         }
                         return new SimpleKSResult(pk);
                     } else if (xmlStructure instanceof RetrievalMethod) {
@@ -331,14 +331,14 @@
                                 throw new KeySelectorException("Unsupported X509Data: " + obj);
                             }
                         }
-                        int numOfMatches = result == null ? 0 : result.size();
+                        int numOfMatches = (result == null ? 0 : result.size());
                         if (numOfMatches != 1) {
                             throw new KeySelectorException
-                                ((numOfMatches == 0 ? "No" : "More than one") +
+                                ((numOfMatches==0?"No":"More than one") +
                                  " match found");
-
                         }
-                        return new SimpleKSResult(result.get(0).getPublicKey());
+                        return new SimpleKSResult(((X509Certificate)
+                                          result.get(0)).getPublicKey());
                     }
                 } catch (Exception ex) {
                     throw new KeySelectorException(ex);
@@ -365,7 +365,7 @@
         public static String dumpArray(byte[] in) {
             int numDumped = 0;
             StringBuilder buf = new StringBuilder(512);
-            buf.append('{');
+            buf.append("{");
             for (int i = 0;i < (in.length / numBytesPerRow); i++) {
                 for (int j=0; j < (numBytesPerRow); j++) {
                     buf.append("(byte)0x");
@@ -377,10 +377,10 @@
             while (numDumped < in.length) {
                 buf.append("(byte)0x");
                 buf.append(getHex(in[numDumped]));
-                buf.append(' ');
+                buf.append(" ");
                 numDumped += 1;
             }
-            buf.append('}');
+            buf.append("}");
             return buf.toString();
         }
     }
diff --git a/src/test/java/javax/xml/crypto/test/OctetStreamDataTest.java b/src/test/java/javax/xml/crypto/test/OctetStreamDataTest.java
index 03e8e53..6a37bf4 100644
--- a/src/test/java/javax/xml/crypto/test/OctetStreamDataTest.java
+++ b/src/test/java/javax/xml/crypto/test/OctetStreamDataTest.java
@@ -21,17 +21,12 @@
  */
 package javax.xml.crypto.test;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.util.*;
 import javax.xml.crypto.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.OctetStreamData
  *
@@ -78,4 +73,4 @@
             assertEquals(osdata.getMimeType(), mimeType);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/Baltimore18Test.java b/src/test/java/javax/xml/crypto/test/dsig/Baltimore18Test.java
index e2a3e3d..9d019d0 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/Baltimore18Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/Baltimore18Test.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
@@ -30,8 +31,6 @@
 import javax.xml.crypto.URIDereferencer;
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "merlin-xmldsig-eighteen"
  * testcases from Baltimore
@@ -122,4 +121,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/Baltimore23Test.java b/src/test/java/javax/xml/crypto/test/dsig/Baltimore23Test.java
index 7ef7673..db0b664 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/Baltimore23Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/Baltimore23Test.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -33,10 +34,6 @@
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a testcase to validate all "merlin-xmldsig-twenty-three"
  * testcases from Baltimore
@@ -244,4 +241,4 @@
         assertTrue("Signature failed core validation", cv);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreExcC14n1Test.java b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreExcC14n1Test.java
index 757e3e3..072bbfa 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreExcC14n1Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreExcC14n1Test.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "merlin-exc-c14n-one"
  * testcases from Baltimore
@@ -62,4 +61,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreIaik2Test.java b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreIaik2Test.java
index 72f760c..a8be98a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreIaik2Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreIaik2Test.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "ec-merlin-iaikTests-two"
  * testcases from Baltimore
@@ -62,4 +61,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreXPathFilter2ThreeTest.java b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreXPathFilter2ThreeTest.java
index 96f0816..ae7136d 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/BaltimoreXPathFilter2ThreeTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/BaltimoreXPathFilter2ThreeTest.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate the "merlin-xpath-filter2-three" testcases
  * under data/vectors/ie/baltimore/merlin-examples directory
@@ -78,4 +77,4 @@
         assertTrue("Signature failed core validation#2", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/C14N11Test.java b/src/test/java/javax/xml/crypto/test/dsig/C14N11Test.java
index 46eeb56..39b4bae 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/C14N11Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/C14N11Test.java
@@ -27,7 +27,6 @@
 
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * This is a testcase to validate all the W3C xmldsig C14N11 testcases.
  *
@@ -174,4 +173,4 @@
             assertTrue(file + " failed core validation", coreValidity);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CanonicalizationMethodTest.java b/src/test/java/javax/xml/crypto/test/dsig/CanonicalizationMethodTest.java
index 882f4b6..5712b9e 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CanonicalizationMethodTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CanonicalizationMethodTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 import java.security.spec.AlgorithmParameterSpec;
@@ -28,14 +29,6 @@
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 import javax.xml.crypto.dsig.spec.ExcC14NParameterSpec;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.CanonicalizationMethod
  *
@@ -49,7 +42,7 @@
             (new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI(), 1);
     }
 
-    private static final String[] C14N_ALGOS = {
+    private static final String C14N_ALGOS[] = {
         CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
         CanonicalizationMethod.INCLUSIVE,
         CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
@@ -76,7 +69,7 @@
                 fail("Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
 
-            assertFalse(cm.isFeatureSupported("not supported"));
+            assertTrue(!cm.isFeatureSupported("not supported"));
         }
     }
 
diff --git a/src/test/java/javax/xml/crypto/test/dsig/ComRSASecurityTest.java b/src/test/java/javax/xml/crypto/test/dsig/ComRSASecurityTest.java
index d7cd97e..7c3c4fe 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/ComRSASecurityTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/ComRSASecurityTest.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "bdournaee"
  * testcases from RSA
@@ -70,4 +69,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CreateBaltimore23Test.java b/src/test/java/javax/xml/crypto/test/dsig/CreateBaltimore23Test.java
index 4e691e6..23a84a0 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CreateBaltimore23Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CreateBaltimore23Test.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.math.BigInteger;
@@ -46,6 +47,7 @@
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
 import javax.xml.crypto.dsig.keyinfo.*;
 import javax.xml.crypto.dsig.spec.*;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.transform.*;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
@@ -55,11 +57,6 @@
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Test that recreates merlin-xmldsig-twenty-three test vectors but with
  * different keys and X.509 data.
@@ -69,6 +66,7 @@
 
     private XMLSignatureFactory fac;
     private KeyInfoFactory kifac;
+    private DocumentBuilder db;
     private CanonicalizationMethod withoutComments;
     private Transform withComments;
     private SignatureMethod dsaSha1, rsaSha1;
@@ -91,16 +89,16 @@
         fac = XMLSignatureFactory.getInstance
             ("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         kifac = fac.getKeyInfoFactory();
+        db = XMLUtils.createDocumentBuilder(false);
 
         // get key & self-signed certificate from keystore
         String fs = System.getProperty("file.separator");
         String base = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
 
-        try (FileInputStream fis = new FileInputStream
-            (base + fs + "src/test/resources" + fs + "test.jks")) {
-            ks = KeyStore.getInstance("JKS");
-            ks.load(fis, "changeit".toCharArray());
-        }
+        FileInputStream fis = new FileInputStream
+            (base + fs + "src/test/resources" + fs + "test.jks");
+        ks = KeyStore.getInstance("JKS");
+        ks.load(fis, "changeit".toCharArray());
         signingKey = ks.getKey("mullan", "changeit".toCharArray());
         signingCert = ks.getCertificate("mullan");
         validatingKey = signingCert.getPublicKey();
@@ -137,7 +135,7 @@
         // create XMLSignature
         XMLSignature sig = fac.newXMLSignature(si, dsa);
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         Element envelope = doc.createElementNS
             ("http://example.org/envelope", "Envelope");
         envelope.setAttributeNS
@@ -152,7 +150,7 @@
             (kvks, envelope.getFirstChild());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
 
         assertTrue(sig2.validate(dvc));
     }
@@ -435,7 +433,7 @@
             (Transform.XPATH, xpf)));
         KeyInfo ki = kifac.newKeyInfo(Collections.singletonList(rm), null);
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
 
         // create objects
         List<XMLObject> objs = new ArrayList<>();
@@ -498,7 +496,7 @@
           + "</xsl:stylesheet>\n";
         Document docxslt = null;
         try (InputStream is = new ByteArrayInputStream(xslt.getBytes())) {
-            docxslt = XMLUtils.read(is, false);
+            docxslt = db.parse(is);
         }
         Node xslElem = docxslt.getDocumentElement();
 
@@ -599,7 +597,8 @@
 
         // read document back into DOM tree
         try {
-            doc = XMLUtils.read(new InputSource(new StringReader(sw.toString())), false);
+            doc = XMLUtils.createDocumentBuilder(false).parse
+                (new InputSource(new StringReader(sw.toString())));
         } catch (SAXParseException spe) {
             System.err.println("line:" + spe.getLineNumber());
             System.err.println("xml:" + sw.toString());
@@ -627,7 +626,7 @@
 
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
@@ -659,7 +658,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
             Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
 
         // create XMLSignature
         XMLSignature sig = fac.newXMLSignature(si, ki);
@@ -689,7 +688,7 @@
 
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
@@ -711,7 +710,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
             Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         // create Objects
         XMLObject obj = fac.newXMLObject(Collections.singletonList
             (new DOMStructure(doc.createTextNode("some text"))),
@@ -729,8 +728,8 @@
             (ks, doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropExcC14NTest.java b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropExcC14NTest.java
index 2ee7b5c..3ffeeae 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropExcC14NTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropExcC14NTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.*;
 import java.security.*;
@@ -37,9 +38,7 @@
 import org.w3c.dom.*;
 
 import javax.xml.crypto.test.KeySelectors;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import javax.xml.parsers.DocumentBuilder;
 
 /**
  * Test that recreates interop exc C14N test vectors
@@ -50,6 +49,7 @@
 
     private XMLSignatureFactory fac;
     private KeyInfoFactory kifac;
+    private DocumentBuilder db;
     private KeyStore ks;
     private Key signingKey;
     private PublicKey validatingKey;
@@ -63,16 +63,16 @@
         fac = XMLSignatureFactory.getInstance
             ("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         kifac = fac.getKeyInfoFactory();
+        db = XMLUtils.createDocumentBuilder(false);
 
         // get key & self-signed certificate from keystore
         String base = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
 
         String fs = System.getProperty("file.separator");
-        try (FileInputStream fis = new FileInputStream
-            (base + fs + "src/test/resources" + fs + "test.jks")) {
-            ks = KeyStore.getInstance("JKS");
-            ks.load(fis, "changeit".toCharArray());
-        }
+        FileInputStream fis = new FileInputStream
+            (base + fs + "src/test/resources" + fs + "test.jks");
+        ks = KeyStore.getInstance("JKS");
+        ks.load(fis, "changeit".toCharArray());
         Certificate signingCert = ks.getCertificate("mullan");
         signingKey = ks.getKey("mullan", "changeit".toCharArray());
         validatingKey = signingCert.getPublicKey();
@@ -138,7 +138,7 @@
         KeyInfo ki = kifac.newKeyInfo(kits);
 
         // create Objects
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         Element baz = doc.createElementNS("urn:bar", "bar:Baz");
         Comment com = doc.createComment(" comment ");
         baz.appendChild(com);
@@ -165,7 +165,7 @@
             (new KeySelectors.KeyValueKeySelector(), foo.getLastChild());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
 
         assertTrue(sig2.validate(dvc));
     }
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXFilter2Test.java b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXFilter2Test.java
index 7ec85cc..ee83d67 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXFilter2Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXFilter2Test.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.*;
 import java.security.*;
@@ -37,9 +38,7 @@
 import org.w3c.dom.*;
 
 import javax.xml.crypto.test.KeySelectors;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import javax.xml.parsers.DocumentBuilder;
 
 /**
  * Test that recreates merlin-xpath-filter2-three test vectors
@@ -50,6 +49,7 @@
 
     private XMLSignatureFactory fac;
     private KeyInfoFactory kifac;
+    private DocumentBuilder db;
     private KeyStore ks;
     private Key signingKey;
     private PublicKey validatingKey;
@@ -64,16 +64,16 @@
         fac = XMLSignatureFactory.getInstance
             ("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         kifac = fac.getKeyInfoFactory();
+        db = XMLUtils.createDocumentBuilder(false);
 
         // get key & self-signed certificate from keystore
         String fs = System.getProperty("file.separator");
         String base = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
 
-        try (FileInputStream fis = new FileInputStream
-            (base + fs + "src/test/resources" + fs + "test.jks")) {
-            ks = KeyStore.getInstance("JKS");
-            ks.load(fis, "changeit".toCharArray());
-        }
+        FileInputStream fis = new FileInputStream
+            (base + fs + "src/test/resources" + fs + "test.jks");
+        ks = KeyStore.getInstance("JKS");
+        ks.load(fis, "changeit".toCharArray());
         signingKey = ks.getKey("mullan", "changeit".toCharArray());
         signingCert = ks.getCertificate("mullan");
         validatingKey = signingCert.getPublicKey();
@@ -128,7 +128,7 @@
         XMLSignature sig = fac.newXMLSignature
             (si, ki, null, null, "signature-value");
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         Element tbs1 = doc.createElementNS(null, "ToBeSigned");
         Comment tbs1Com = doc.createComment(" comment ");
         Element tbs1Data = doc.createElementNS(null, "Data");
@@ -164,9 +164,9 @@
             (new KeySelectors.KeyValueKeySelector(), document.getLastChild());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
 
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXMLDSig11Test.java b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXMLDSig11Test.java
index 145c5d6..0d7fda7 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXMLDSig11Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CreateInteropXMLDSig11Test.java
@@ -29,16 +29,15 @@
 import javax.xml.crypto.dsig.dom.*;
 import javax.xml.crypto.dsig.keyinfo.*;
 import javax.xml.crypto.dsig.spec.*;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.*;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * This is a testcase to generate all the W3C xmldsig XMLDSig11 testcases.
  *
@@ -53,6 +52,7 @@
                             hmacSha384, hmacSha512;
     private KeyInfo p256ki, p384ki, p521ki, rsaki, rsa2048ki;
     private XMLSignatureFactory fac;
+    private DocumentBuilder db;
     private KeyPair p256, p384, p521, rsa2048;
     private boolean ecSupport = true;
 
@@ -82,6 +82,7 @@
         rsakpg.initialize(2048);
         rsa2048 = rsakpg.generateKeyPair();
 
+        db = XMLUtils.createDocumentBuilder(false);
         // create common objects
         fac = XMLSignatureFactory.getInstance("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         KeyInfoFactory kifac = fac.getKeyInfoFactory();
@@ -294,7 +295,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
                                           Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         // create Objects
         Element webElem = doc.createElementNS(null, "Web");
         Text text = doc.createTextNode("up up and away");
@@ -315,8 +316,8 @@
         (ks, doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/CreatePhaosXMLDSig3Test.java b/src/test/java/javax/xml/crypto/test/dsig/CreatePhaosXMLDSig3Test.java
index 5524503..36ad7ac 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/CreatePhaosXMLDSig3Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/CreatePhaosXMLDSig3Test.java
@@ -21,35 +21,22 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
+
 import java.nio.charset.StandardCharsets;
-import java.security.Security;
-import java.util.Collections;
+import java.security.*;
+import java.util.*;
 
 import javax.xml.crypto.URIDereferencer;
-import javax.xml.crypto.dsig.CanonicalizationMethod;
-import javax.xml.crypto.dsig.DigestMethod;
-import javax.xml.crypto.dsig.Reference;
-import javax.xml.crypto.dsig.SignatureMethod;
-import javax.xml.crypto.dsig.SignedInfo;
-import javax.xml.crypto.dsig.Transform;
-import javax.xml.crypto.dsig.XMLSignature;
-import javax.xml.crypto.dsig.XMLSignatureException;
-import javax.xml.crypto.dsig.XMLSignatureFactory;
-import javax.xml.crypto.dsig.dom.DOMSignContext;
-import javax.xml.crypto.dsig.dom.DOMValidateContext;
-import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
-import javax.xml.crypto.dsig.spec.HMACParameterSpec;
-import javax.xml.crypto.dsig.spec.TransformParameterSpec;
-import javax.xml.crypto.test.KeySelectors;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
+import javax.xml.crypto.dsig.*;
+import javax.xml.crypto.dsig.dom.*;
+import javax.xml.crypto.dsig.spec.*;
 
 import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import javax.xml.crypto.test.KeySelectors;
+import javax.xml.parsers.DocumentBuilder;
 
 /**
  * Test that recreates Phaos XMLDSig-3 test vectors
@@ -60,6 +47,7 @@
 public class CreatePhaosXMLDSig3Test {
 
     private XMLSignatureFactory fac;
+    private DocumentBuilder db;
 
     static {
         Security.insertProviderAt
@@ -69,6 +57,7 @@
     public CreatePhaosXMLDSig3Test() throws Exception {
         fac = XMLSignatureFactory.getInstance
             ("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
+        db = XMLUtils.createDocumentBuilder(false);
     }
 
     @org.junit.Test
@@ -112,7 +101,7 @@
         // create XMLSignature
         XMLSignature sig = fac.newXMLSignature(si, null);
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         DOMSignContext dsc = new DOMSignContext
             (new KeySelectors.SecretKeySelector
              ("test".getBytes(StandardCharsets.US_ASCII)), doc);
@@ -129,7 +118,7 @@
 
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
 
         assertTrue(sig2.validate(dvc));
     }
@@ -154,7 +143,7 @@
         // create XMLSignature
         XMLSignature sig = fac.newXMLSignature(si, null);
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         Element player = doc.createElementNS(null, "player");
         player.setAttributeNS(null, "bats", "left");
         player.setAttributeNS(null, "id", "10012");
@@ -184,9 +173,9 @@
 
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
 
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java b/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java
index 5da466e..7819309 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java
@@ -28,6 +28,7 @@
 import javax.xml.crypto.dsig.keyinfo.*;
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 import java.util.*;
@@ -35,10 +36,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a simple example of generating and validating a Detached XML
  * Signature using the JSR 105 API. The resulting signature will look
@@ -137,7 +134,7 @@
 
             // Create an XMLSignContext and set the
             // DSA PrivateKey for signing
-            Document doc = XMLUtils.newDocument();
+            Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
             DOMSignContext signContext = new DOMSignContext(kp.getPrivate(), doc);
             signContext.putNamespacePrefix(XMLSignature.XMLNS, "ds");
 
@@ -160,7 +157,7 @@
             boolean coreValidity = signature.validate(vc);
 
             // Check core validation status
-            if (!coreValidity) {
+            if (coreValidity == false) {
                 // check the validation status of each Reference
                 @SuppressWarnings("unchecked")
                 Iterator<Reference> i = signature.getSignedInfo().getReferences().iterator();
diff --git a/src/test/java/javax/xml/crypto/test/dsig/DigestMethodTest.java b/src/test/java/javax/xml/crypto/test/dsig/DigestMethodTest.java
index e6e11a9..1c7b205 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/DigestMethodTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/DigestMethodTest.java
@@ -23,15 +23,10 @@
 
 import javax.xml.crypto.dsig.*;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.DigestMethod
  *
@@ -40,7 +35,7 @@
 
     private XMLSignatureFactory factory;
 
-    private static final String[] MD_ALGOS = {
+    private static final String MD_ALGOS[] = {
         DigestMethod.SHA1
     };
 
@@ -59,7 +54,7 @@
                 dm.isFeatureSupported(null);
                 fail("Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
-            assertFalse(dm.isFeatureSupported("not supported"));
+            assertTrue(!dm.isFeatureSupported("not supported"));
         }
     }
 
diff --git a/src/test/java/javax/xml/crypto/test/dsig/HMACSignatureAlgorithmTest.java b/src/test/java/javax/xml/crypto/test/dsig/HMACSignatureAlgorithmTest.java
index 439863c..8f463d4 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/HMACSignatureAlgorithmTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/HMACSignatureAlgorithmTest.java
@@ -40,16 +40,15 @@
 import javax.xml.crypto.dsig.keyinfo.KeyInfo;
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 import javax.xml.crypto.test.KeySelectors;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Test signing using all available HMAC signing algorithms
  */
@@ -61,6 +60,7 @@
     private DigestMethod sha1;
     private SignatureMethod hmacSha1, hmacSha224, hmacSha256, hmacSha384, hmacSha512, ripemd160;
     private XMLSignatureFactory fac;
+    private DocumentBuilder db;
 
     static {
         Security.insertProviderAt
@@ -91,6 +91,7 @@
 
     public HMACSignatureAlgorithmTest() throws Exception {
 
+        db = XMLUtils.createDocumentBuilder(false);
         // create common objects
         fac = XMLSignatureFactory.getInstance("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         withoutComments = fac.newCanonicalizationMethod
@@ -163,7 +164,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
                                           Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         // create Objects
         Element webElem = doc.createElementNS(null, "Web");
         Text text = doc.createTextNode("up up and away");
@@ -187,8 +188,8 @@
         (ks, doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/IaikCoreFeaturesTest.java b/src/test/java/javax/xml/crypto/test/dsig/IaikCoreFeaturesTest.java
index b67aa48..68d84ca 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/IaikCoreFeaturesTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/IaikCoreFeaturesTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -30,8 +31,6 @@
 import javax.xml.crypto.dsig.XMLSignatureFactory;
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "coreFeatures"
  * testcases from IAIK
@@ -136,4 +135,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/IaikSignatureAlgosTest.java b/src/test/java/javax/xml/crypto/test/dsig/IaikSignatureAlgosTest.java
index a1861de..1c51671 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/IaikSignatureAlgosTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/IaikSignatureAlgosTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
@@ -29,10 +30,6 @@
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a testcase to validate all "signatureAlgorithms"
  * testcases from IAIK
@@ -97,4 +94,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/IaikTransformsTest.java b/src/test/java/javax/xml/crypto/test/dsig/IaikTransformsTest.java
index 11a031a..bb85279 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/IaikTransformsTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/IaikTransformsTest.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "transforms"
  * testcases from IAIK
@@ -89,4 +88,4 @@
         assertTrue("Signature failed core validation", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/InteropC14nTest.java b/src/test/java/javax/xml/crypto/test/dsig/InteropC14nTest.java
index f9105e4..46b04aa 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/InteropC14nTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/InteropC14nTest.java
@@ -21,14 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.security.Security;
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a testcase to validate all "c14n" testcases
  * under data/vectors/interop directory
@@ -130,4 +129,4 @@
         assertTrue("Signature failed core validation#2", coreValidity);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/InteropXMLDSig11Test.java b/src/test/java/javax/xml/crypto/test/dsig/InteropXMLDSig11Test.java
index da81f3b..afb29ba 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/InteropXMLDSig11Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/InteropXMLDSig11Test.java
@@ -29,7 +29,6 @@
 
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * This is a testcase to validate all the W3C xmldsig XMLDSig11 testcases.
  *
@@ -210,4 +209,4 @@
         boolean coreValidity = validator.validate(file, ks);
         assertTrue(file + " failed core validation", coreValidity);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenRefCountTest.java b/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenRefCountTest.java
index cde731e..e5ff3ee 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenRefCountTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenRefCountTest.java
@@ -18,9 +18,9 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.security.Security;
 
 import javax.xml.crypto.MarshalException;
@@ -31,8 +31,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * This is a test for a forbidden number of references when secure validation is enabled.
  */
@@ -74,10 +72,11 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         return (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
                                                  Constants._TAG_SIGNEDINFO).item(0);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenReferenceTest.java b/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenReferenceTest.java
index 8b18890..c445330 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenReferenceTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/JSRForbiddenReferenceTest.java
@@ -18,6 +18,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
@@ -27,10 +28,6 @@
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a test for a forbidden Reference algorithm when secure validation is enabled.
  */
@@ -76,4 +73,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/JSRWrappingAttackTest.java b/src/test/java/javax/xml/crypto/test/dsig/JSRWrappingAttackTest.java
index 716901c..e12aec3 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/JSRWrappingAttackTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/JSRWrappingAttackTest.java
@@ -18,9 +18,9 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.security.Security;
 
 import javax.xml.crypto.dsig.XMLSignatureException;
@@ -31,10 +31,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a test for a wrapping attack.
  */
@@ -61,7 +57,7 @@
     public void testWrappingAttack() throws Exception {
         String file = "manifestSignatureWrapping.xml";
 
-        Document doc = XMLUtils.read(new FileInputStream(new File(dir, file)), false);
+        Document doc = XMLUtils.createDocumentBuilder(false, false).parse(new File(dir, file));
         Element sigElement = SignatureValidator.getSignatureElement(doc);
         if (sigElement == null) {
             throw new Exception("Couldn't find signature Element");
@@ -89,4 +85,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/ManifestTest.java b/src/test/java/javax/xml/crypto/test/dsig/ManifestTest.java
index 5c181b5..2a5fa39 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/ManifestTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/ManifestTest.java
@@ -21,17 +21,11 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.util.*;
 import javax.xml.crypto.dsig.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.Manifest
  *
@@ -76,7 +70,7 @@
                 break;
             }
             assertNotNull(man);
-            assertArrayEquals(man.getReferences().toArray(), refs.toArray());
+            assertTrue(Arrays.equals(man.getReferences().toArray(), refs.toArray()));
             assertEquals(man.getId(), expectedId);
         }
 
@@ -154,7 +148,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(man.isFeatureSupported("not supported"));
+        assertTrue(!man.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
diff --git a/src/test/java/javax/xml/crypto/test/dsig/PKSignatureAlgorithmTest.java b/src/test/java/javax/xml/crypto/test/dsig/PKSignatureAlgorithmTest.java
index 3a12c96..8329023 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/PKSignatureAlgorithmTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/PKSignatureAlgorithmTest.java
@@ -44,6 +44,7 @@
 import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 import javax.xml.crypto.test.KeySelectors;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.junit.BeforeClass;
@@ -51,10 +52,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Test signing using all available PublicKey signing algorithms
  */
@@ -67,6 +66,7 @@
     private SignatureMethod rsaSha1Mgf1, rsaSha224Mgf1, rsaSha256Mgf1, rsaSha384Mgf1, rsaSha512Mgf1;
     private SignatureMethod ecdsaSha1, ecdsaSha224, ecdsaSha256, ecdsaSha384, ecdsaSha512, ecdsaRipemd160;
     private XMLSignatureFactory fac;
+    private DocumentBuilder db;
     private KeyPair rsaKeyPair, ecKeyPair;
     private KeyInfo rsaki, ecki;
     private boolean ecAlgParamsSupport = true;
@@ -109,6 +109,7 @@
             ecAlgParamsSupport = false;
         }
 
+        db = XMLUtils.createDocumentBuilder(false);
         // create common objects
         fac = XMLSignatureFactory.getInstance("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         withoutComments = fac.newCanonicalizationMethod
@@ -290,7 +291,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
                                           Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         // create Objects
         Element webElem = doc.createElementNS(null, "Web");
         Text text = doc.createTextNode("up up and away");
@@ -314,8 +315,8 @@
         (ks, doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/PhaosXMLDSig3Test.java b/src/test/java/javax/xml/crypto/test/dsig/PhaosXMLDSig3Test.java
index 73051bc..0ab7177 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/PhaosXMLDSig3Test.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/PhaosXMLDSig3Test.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
@@ -32,11 +33,6 @@
 
 import javax.xml.crypto.test.KeySelectors;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a testcase to validate all "phaos-xmldsig-three"
  * testcases from Phaos
@@ -315,4 +311,4 @@
             validator.validate(file, new KeySelectors.RawX509KeySelector());
         assertTrue("Signature failed core validation", coreValidity);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/ReferenceTest.java b/src/test/java/javax/xml/crypto/test/dsig/ReferenceTest.java
index 2b8aa9f..866eafb 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/ReferenceTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/ReferenceTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.security.MessageDigest;
@@ -35,15 +36,6 @@
 import javax.xml.crypto.dsig.spec.TransformParameterSpec;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.Reference
  *
@@ -138,8 +130,8 @@
             // try empty transforms list
             ref = fac.newReference(uri, dmSHA1, transforms,
                                    type, id);
-            assertArrayEquals(transforms.toArray(),
-                                     ref.getTransforms().toArray());
+            assertTrue(Arrays.equals(transforms.toArray(),
+                                     ref.getTransforms().toArray()));
         } catch(Exception ex) {
             fail("Unexpected Exception: " + ex);
         }
@@ -178,8 +170,8 @@
         try {
             // try a transforms list with a Transform object
             ref = fac.newReference(uri, dmSHA1, transforms, type, id);
-            assertArrayEquals(transforms.toArray(),
-                                     ref.getTransforms().toArray());
+            assertTrue(Arrays.equals(transforms.toArray(),
+                                     ref.getTransforms().toArray()));
         } catch (Exception ex) {
             fail("Unexpected Exception: " + ex);
         }
@@ -193,7 +185,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(ref.isFeatureSupported("not supported"));
+        assertTrue(!ref.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
@@ -272,7 +264,7 @@
                     }
                     byte[] dv = validated_ref.getDigestValue();
                     byte[] cdv = validated_ref.getCalculatedDigestValue();
-                    assertArrayEquals(dv, cdv);
+                    assertTrue(Arrays.equals(dv, cdv));
                     boolean valid = validated_ref.validate(validateContext);
                     assertTrue(valid);
                 }
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SecureXSLTTest.java b/src/test/java/javax/xml/crypto/test/dsig/SecureXSLTTest.java
index e00813e..5e4228e 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SecureXSLTTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SecureXSLTTest.java
@@ -30,8 +30,6 @@
 import javax.xml.crypto.test.KeySelectors;
 
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
 
 public class SecureXSLTTest {
 
@@ -82,7 +80,7 @@
         File f = new File("doc.xml");
 
         Document doc =
-            XMLUtils.read(new FileInputStream(signatureFile), false);
+            XMLUtils.createDocumentBuilder(false).parse(new FileInputStream(signatureFile));
 
         NodeList nl =
             doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
@@ -102,8 +100,8 @@
         } finally {
             if (f.exists()) {
                 f.delete(); // cleanup file. comment out when debugging
-                fail("Test FAILED: doc.xml was successfully created");
+                throw new Exception("Test FAILED: doc.xml was successfully created");
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignatureDigestMethodTest.java b/src/test/java/javax/xml/crypto/test/dsig/SignatureDigestMethodTest.java
index 7afe5cc..90499ce 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignatureDigestMethodTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignatureDigestMethodTest.java
@@ -38,16 +38,15 @@
 import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 import javax.xml.crypto.test.KeySelectors;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Test signing using all available digest methods
  */
@@ -60,6 +59,7 @@
     private SignatureMethod rsaSha1;
     private KeyInfo rsaki;
     private XMLSignatureFactory fac;
+    private DocumentBuilder db;
     private boolean bcInstalled;
 
     static {
@@ -69,6 +69,7 @@
 
     public SignatureDigestMethodTest() throws Exception {
 
+        db = XMLUtils.createDocumentBuilder(false);
         // create common objects
         fac = XMLSignatureFactory.getInstance("DOM", new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
         KeyInfoFactory kifac = fac.getKeyInfoFactory();
@@ -182,7 +183,7 @@
         SignedInfo si = fac.newSignedInfo(withoutComments, sm,
                                           Collections.singletonList(ref));
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         // create Objects
         Element webElem = doc.createElementNS(null, "Web");
         Text text = doc.createTextNode("up up and away");
@@ -206,8 +207,8 @@
         (ks, doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        assertEquals(sig, sig2);
+        assertTrue(sig.equals(sig2));
         assertTrue(sig2.validate(dvc));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignatureMethodTest.java b/src/test/java/javax/xml/crypto/test/dsig/SignatureMethodTest.java
index ede7b5c..480668a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignatureMethodTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignatureMethodTest.java
@@ -23,15 +23,10 @@
 
 import javax.xml.crypto.dsig.*;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.SignatureMethod
  *
@@ -40,7 +35,7 @@
 
     XMLSignatureFactory factory;
 
-    private static final String[] SIG_ALGOS = {
+    private static final String SIG_ALGOS[] = {
         SignatureMethod.DSA_SHA1,
         SignatureMethod.RSA_SHA1,
         SignatureMethod.HMAC_SHA1
@@ -62,7 +57,7 @@
                 fail("Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
 
-            assertFalse(sm.isFeatureSupported("not supported"));
+            assertTrue(!sm.isFeatureSupported("not supported"));
         }
     }
 
@@ -104,3 +99,4 @@
     }
 
 }
+
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertiesTest.java b/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertiesTest.java
index b775632..eb8933b 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertiesTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertiesTest.java
@@ -21,17 +21,11 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.util.*;
 import javax.xml.crypto.dsig.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.SignatureProperties
  *
@@ -98,7 +92,7 @@
             unmodifiable.add(prop);
             fail("Should return an unmodifiable List object");
         } catch (UnsupportedOperationException uoe) {}
-        assertArrayEquals(unmodifiable.toArray(), list.toArray());
+        assertTrue(Arrays.equals(unmodifiable.toArray(), list.toArray()));
         assertNotNull(props);
         assertEquals(props.getId(), id);
     }
@@ -113,7 +107,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(props.isFeatureSupported("not supported"));
+        assertTrue(!props.isFeatureSupported("not supported"));
     }
 
     @SuppressWarnings({
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertyTest.java b/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertyTest.java
index 9318d1a..471c664 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertyTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignaturePropertyTest.java
@@ -21,18 +21,12 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.util.*;
 import javax.xml.crypto.XMLStructure;
 import javax.xml.crypto.dsig.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.SignatureProperty
  *
@@ -100,7 +94,7 @@
             unmodifiable.add(new TestUtils.MyOwnXMLStructure());
             fail("Should return an unmodifiable List object");
         } catch (UnsupportedOperationException uoe) {}
-        assertArrayEquals(unmodifiable.toArray(), list.toArray());
+        assertTrue(Arrays.equals(unmodifiable.toArray(), list.toArray()));
         assertEquals(prop.getTarget(), target);
         assertEquals(prop.getId(), id);
         assertNotNull(prop);
@@ -117,7 +111,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(prop.isFeatureSupported("not supported"));
+        assertTrue(!prop.isFeatureSupported("not supported"));
     }
 
     @SuppressWarnings({
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignatureValidator.java b/src/test/java/javax/xml/crypto/test/dsig/SignatureValidator.java
index 205ed11..b401e13 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignatureValidator.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignatureValidator.java
@@ -52,7 +52,7 @@
 
     public DOMValidateContext getValidateContext(String fn, KeySelector ks)
         throws Exception {
-        Document doc = XMLUtils.read(new FileInputStream(new File(dir, fn)), false);
+        Document doc = XMLUtils.createDocumentBuilder(false, false).parse(new File(dir, fn));
         Element sigElement = getSignatureElement(doc);
         if (sigElement == null) {
             throw new Exception("Couldn't find signature Element");
@@ -81,7 +81,7 @@
         boolean coreValidity = signature.validate(vc);
 
         // Check core validation status
-        if (!coreValidity) {
+        if (coreValidity == false) {
             // check the validation status of each Reference
             @SuppressWarnings("unchecked")
             Iterator<Reference> i = signature.getSignedInfo().getReferences().iterator();
diff --git a/src/test/java/javax/xml/crypto/test/dsig/SignedInfoTest.java b/src/test/java/javax/xml/crypto/test/dsig/SignedInfoTest.java
index 80ef9fa..bb127ce 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/SignedInfoTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/SignedInfoTest.java
@@ -21,19 +21,13 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.security.Security;
 import java.util.*;
 import javax.xml.crypto.dsig.*;
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.SignedInfo
  *
@@ -123,8 +117,8 @@
                      sm.getAlgorithm());
         assertEquals(si.getSignatureMethod().getParameterSpec(),
                      sm.getParameterSpec());
-        assertArrayEquals(si.getReferences().toArray(),
-                                 references.toArray());
+        assertTrue(Arrays.equals(si.getReferences().toArray(),
+                                 references.toArray()));
         assertNull(si.getId());
 
         // test XMLSignatureFactory.newSignedInfo(
diff --git a/src/test/java/javax/xml/crypto/test/dsig/TestUtils.java b/src/test/java/javax/xml/crypto/test/dsig/TestUtils.java
index a1252a0..c4b5d3a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/TestUtils.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/TestUtils.java
@@ -23,7 +23,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -63,6 +62,7 @@
 import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
 import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
 import javax.xml.crypto.dsig.spec.SignatureMethodParameterSpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Result;
 import javax.xml.transform.Transformer;
@@ -114,9 +114,9 @@
 
     public static PublicKey getPublicKey(String algo)
         throws InvalidKeySpecException, NoSuchAlgorithmException {
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             return getPublicKey("DSA", 1024);
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             return getPublicKey("RSA", 512);
         } else {
             throw new RuntimeException("Unsupported key algorithm " + algo);
@@ -127,7 +127,7 @@
         throws InvalidKeySpecException, NoSuchAlgorithmException {
         KeyFactory kf = KeyFactory.getInstance(algo);
         KeySpec kspec;
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             if (keysize == 1024) {
                 kspec = new DSAPublicKeySpec(new BigInteger(DSA_Y),
                                              new BigInteger(DSA_P),
@@ -141,7 +141,7 @@
             } else {
                 throw new RuntimeException("Unsupported keysize:" + keysize);
             }
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             if (keysize == 512) {
                 kspec = new RSAPublicKeySpec(new BigInteger(RSA_MOD),
                                              new BigInteger(RSA_PUB));
@@ -164,9 +164,9 @@
 
     public static PrivateKey getPrivateKey(String algo)
         throws InvalidKeySpecException, NoSuchAlgorithmException {
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             return getPrivateKey("DSA", 1024);
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             return getPrivateKey("RSA", 512);
         } else {
             throw new RuntimeException("Unsupported key algorithm " + algo);
@@ -177,7 +177,7 @@
         throws InvalidKeySpecException, NoSuchAlgorithmException {
         KeyFactory kf = KeyFactory.getInstance(algo);
         KeySpec kspec;
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             if (keysize == 1024) {
                 kspec = new DSAPrivateKeySpec
                     (new BigInteger(DSA_X), new BigInteger(DSA_P),
@@ -189,7 +189,7 @@
             } else {
                 throw new RuntimeException("Unsupported keysize:" + keysize);
             }
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             if (keysize == 512) {
                 kspec = new RSAPrivateKeySpec
                     (new BigInteger(RSA_MOD), new BigInteger(RSA_PRIV));
@@ -214,7 +214,8 @@
 
     public static Document newDocument() {
         try {
-            return XMLUtils.newDocument();
+            DocumentBuilder docBuilder = XMLUtils.createDocumentBuilder(false);
+            return docBuilder.newDocument();
         } catch (Exception ex) {
             return null;
         }
@@ -232,8 +233,9 @@
                                                        File input,
                                                        String tag)
         throws Exception {
-        if ("dom".equalsIgnoreCase(type)) {
-            Document doc = XMLUtils.read(new FileInputStream(input), false);
+        if (type.equalsIgnoreCase("dom")) {
+            DocumentBuilder docBuilder = XMLUtils.createDocumentBuilder(false, false);
+            Document doc = docBuilder.parse(input);
             if (tag == null) {
                 return new DOMValidateContext
                     (TestUtils.getPublicKey("RSA", 512),
@@ -288,7 +290,7 @@
         }
 
         public byte[] getCalculatedDigestValue() {
-            return new byte[0];
+            return null;
         }
 
         public DigestMethod getDigestMethod() { return DIG_METHOD; }
@@ -341,7 +343,7 @@
         private byte[] data;
 
         public OctetStreamURIDereferencer(byte[] in) {
-            data = in.clone();
+            data = (byte[]) in.clone();
         }
 
         public Data dereference(URIReference ref, XMLCryptoContext ctxt) {
diff --git a/src/test/java/javax/xml/crypto/test/dsig/TransformTest.java b/src/test/java/javax/xml/crypto/test/dsig/TransformTest.java
index 1ffe0b6..f1aaabf 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/TransformTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/TransformTest.java
@@ -30,15 +30,10 @@
 import javax.xml.crypto.dsig.spec.XPathFilter2ParameterSpec;
 import javax.xml.crypto.dsig.spec.XSLTTransformParameterSpec;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.Transform
  *
@@ -47,7 +42,7 @@
 
     XMLSignatureFactory factory;
 
-    private static final String[] TRANSFORM_ALGOS = {
+    private static final String TRANSFORM_ALGOS[] = {
         Transform.BASE64,
         Transform.ENVELOPED,
         Transform.XPATH,
@@ -87,7 +82,7 @@
                      ": Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
 
-            assertFalse(tm.isFeatureSupported("not supported"));
+            assertTrue(!tm.isFeatureSupported("not supported"));
         }
     }
 
diff --git a/src/test/java/javax/xml/crypto/test/dsig/ValidateSignatureTest.java b/src/test/java/javax/xml/crypto/test/dsig/ValidateSignatureTest.java
index a93b0eb..af2d463 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/ValidateSignatureTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/ValidateSignatureTest.java
@@ -18,6 +18,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
@@ -36,11 +37,6 @@
 import javax.xml.crypto.dsig.XMLSignatureFactory;
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a testcase that validates various signatures
  *
@@ -168,4 +164,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/X509KeySelector.java b/src/test/java/javax/xml/crypto/test/dsig/X509KeySelector.java
index 2af9347..40a9c14 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/X509KeySelector.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/X509KeySelector.java
@@ -230,7 +230,7 @@
         SignatureMethod sm) throws KeyStoreException {
         // skip non-signer certs
         boolean[] keyUsage = xcert.getKeyUsage();
-        if (keyUsage != null && !keyUsage[0]) {
+        if (keyUsage != null && keyUsage[0] == false) {
             return null;
         }
         String alias = ks.getCertificateAlias(xcert);
@@ -273,8 +273,15 @@
      */
     //@@@FIXME: this should also work for key types other than DSA/RSA
     private boolean algEquals(String algURI, String algName) {
-        return ("DSA".equalsIgnoreCase(algName) && algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)
-            || "RSA".equalsIgnoreCase(algName) && algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1));
+        if (algName.equalsIgnoreCase("DSA") &&
+            algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
+            return true;
+        } else if (algName.equalsIgnoreCase("RSA") &&
+            algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
+            return true;
+        } else {
+            return false;
+        }
     }
 
     /**
diff --git a/src/test/java/javax/xml/crypto/test/dsig/XMLObjectTest.java b/src/test/java/javax/xml/crypto/test/dsig/XMLObjectTest.java
index 1378dff..e1cbac2 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/XMLObjectTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/XMLObjectTest.java
@@ -21,18 +21,12 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.util.*;
 import javax.xml.crypto.XMLStructure;
 import javax.xml.crypto.dsig.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.XMLObject
  *
@@ -79,7 +73,7 @@
         obj = factory.newXMLObject(list, id, mimeType, encoding);
         assertNotNull(obj);
         assertNotNull(obj.getContent());
-        assertArrayEquals(obj.getContent().toArray(), list.toArray());
+        assertTrue(Arrays.equals(obj.getContent().toArray(), list.toArray()));
         assertEquals(obj.getId(), id);
         assertEquals(obj.getMimeType(), mimeType);
         assertEquals(obj.getEncoding(), encoding);
@@ -90,7 +84,7 @@
             unmodifiable.add(new TestUtils.MyOwnXMLStructure());
             fail("Should return an unmodifiable List object");
         } catch (UnsupportedOperationException uoe) {}
-        assertArrayEquals(unmodifiable.toArray(), list.toArray());
+        assertTrue(Arrays.equals(unmodifiable.toArray(), list.toArray()));
     }
 
     @org.junit.Test
@@ -103,7 +97,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(obj.isFeatureSupported("not supported"));
+        assertTrue(!obj.isFeatureSupported("not supported"));
     }
 
     @SuppressWarnings({
diff --git a/src/test/java/javax/xml/crypto/test/dsig/XMLSignContextTest.java b/src/test/java/javax/xml/crypto/test/dsig/XMLSignContextTest.java
index c48ce42..102c54f 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/XMLSignContextTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/XMLSignContextTest.java
@@ -26,17 +26,13 @@
 import javax.xml.crypto.KeySelector;
 import javax.xml.crypto.URIDereferencer;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.XMLSignContext
  *
@@ -112,4 +108,4 @@
         defContext.setKeySelector(ks);
         assertEquals(defContext.getKeySelector(), ks);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureFactoryTest.java b/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureFactoryTest.java
index a62b9a9..9c1cdc9 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureFactoryTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureFactoryTest.java
@@ -21,9 +21,9 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.security.NoSuchProviderException;
 import java.security.Provider;
 import java.security.Security;
@@ -32,17 +32,12 @@
 import javax.xml.crypto.*;
 import javax.xml.crypto.dsig.*;
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.XMLSignatureFactory
  *
@@ -107,7 +102,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(factory.isFeatureSupported("not supported"));
+        assertTrue(!factory.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
@@ -158,12 +153,13 @@
                  " for wrong inputs");
         }
 
+        DocumentBuilder docBuilder = XMLUtils.createDocumentBuilder(false, false);
         String fs = System.getProperty("file.separator");
         String base = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
         File dir = new File(base + fs +
             "src/test/resources" + fs + "ie" + fs + "baltimore" + fs + "merlin-examples",
             "merlin-xmldsig-twenty-three");
-        Document doc = XMLUtils.read(new FileInputStream(new File(dir, "signature.xml")), false);
+        Document doc = docBuilder.parse(new File(dir, "signature.xml"));
         NodeList nl = doc.getElementsByTagName("KeyInfo");
         try {
             stuff = factory.unmarshalXMLSignature
@@ -178,6 +174,7 @@
             assertNotNull(stuff);
         } catch (MarshalException ex) {
             fail("Unmarshal failed: " + ex.getMessage());
+            ex.printStackTrace();
         }
     }
 
diff --git a/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureTest.java b/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureTest.java
index e21b1e4..5359b12 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/XMLSignatureTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.util.*;
@@ -38,14 +39,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.XMLSignature
  *
@@ -109,10 +102,13 @@
         // for generating XMLSignature objects
         for (int i = 0; i < 2; i++) {
             try {
-                if (i == 0) {
+                switch (i) {
+                case 0:
                     sig = fac.newXMLSignature(null, defKi);
-                } else if (i == 1) {
+                    break;
+                case 1:
                     sig = fac.newXMLSignature(null, defKi, objs, id, sigValueId);
+                    break;
                 }
                 fail("Should throw a NPE for null references");
             } catch (NullPointerException npe) {
@@ -135,7 +131,7 @@
         sig = fac.newXMLSignature(defSi, defKi, objs, id, sigValueId);
         assertEquals(sig.getId(), id);
         assertEquals(sig.getKeyInfo(), defKi);
-        assertArrayEquals(sig.getObjects().toArray(), objs.toArray());
+        assertTrue(Arrays.equals(sig.getObjects().toArray(), objs.toArray()));
         assertNull(sig.getSignatureValue().getValue());
         assertEquals(sig.getSignatureValue().getId(), sigValueId);
         assertEquals(sig.getSignedInfo(), defSi);
@@ -159,7 +155,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(sig.isFeatureSupported("not supported"));
+        assertTrue(!sig.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
@@ -187,7 +183,7 @@
             validateContext = new DOMValidateContext
                 (VALIDATE_KEYS[i], doc.getDocumentElement());
             validateContext.setURIDereferencer(ud);
-            if (!sig.validate(validateContext)) {
+            if (sig.validate(validateContext) == false) {
                 status = false;
                 TestUtils.dumpDocument(doc, "signatureTest_out"+i+".xml");
             }
@@ -293,11 +289,11 @@
             (VALIDATE_KEYS[1], doc.getDocumentElement());
         XMLSignature sig2 = fac.unmarshalXMLSignature(dvc);
 
-        if (!sig.equals(sig2)) {
+        if (sig.equals(sig2) == false) {
             throw new Exception
                 ("Unmarshalled signature is not equal to generated signature");
         }
-        if (!sig2.validate(dvc)) {
+        if (sig2.validate(dvc) == false) {
             throw new Exception("Validation of generated signature failed");
         }
     }
@@ -310,7 +306,7 @@
         File f = new File(base + "/src/test/resources/javax/xml/crypto/dsig/" +
             "signature-enveloping-rsa-template.xml");
 
-        Document doc = XMLUtils.read(new FileInputStream(f), false);
+        Document doc = XMLUtils.createDocumentBuilder(false).parse(new FileInputStream(f));
 
         // Find Signature element
         NodeList nl =
@@ -337,7 +333,7 @@
         // check that Object element retained namespace definitions
         Element objElem = (Element)parent.getFirstChild().getLastChild();
         Attr a = objElem.getAttributeNode("xmlns:test");
-        if (!"http://www.example.org/ns".equals(a.getValue())) {
+        if (!a.getValue().equals("http://www.example.org/ns")) {
             throw new Exception("Object namespace definition not retained");
         }
     }
@@ -385,7 +381,7 @@
         SignatureMethod sm = fac.newSignatureMethod(DSA_SHA256, null);
         SignedInfo si = createSignedInfo(sm);
         KeyInfo ki = kifac.newKeyInfo(Collections.singletonList
-            (kifac.newKeyValue(TestUtils.getPublicKey("DSA", 2048))));
+            (kifac.newKeyValue((PublicKey)TestUtils.getPublicKey("DSA", 2048))));
         XMLSignature sig = fac.newXMLSignature(si, ki, objs, id, sigValueId);
         Document doc = TestUtils.newDocument();
         XMLSignContext signContext =
diff --git a/src/test/java/javax/xml/crypto/test/dsig/XMLValidateContextTest.java b/src/test/java/javax/xml/crypto/test/dsig/XMLValidateContextTest.java
index 95631c6..873f60d 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/XMLValidateContextTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/XMLValidateContextTest.java
@@ -25,15 +25,11 @@
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
 import javax.xml.crypto.dsig.*;
 
+import static org.junit.Assert.*;
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.XMLValidateContext
  *
@@ -107,4 +103,4 @@
         defContext.setURIDereferencer(null);
         assertNull(defContext.getURIDereferencer());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/dom/DOMValidateContextTest.java b/src/test/java/javax/xml/crypto/test/dsig/dom/DOMValidateContextTest.java
index 263b5b9..bf6d56a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/dom/DOMValidateContextTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/dom/DOMValidateContextTest.java
@@ -21,18 +21,13 @@
  */
 package javax.xml.crypto.test.dsig.dom;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import javax.xml.crypto.dsig.dom.DOMValidateContext;
 
 import javax.xml.crypto.test.dsig.TestUtils;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.dom.DOMValidateContext
  *
@@ -97,4 +92,4 @@
         assertNotNull(domVC.getNode());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoFactoryTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoFactoryTest.java
index c6a524b..0eed51b 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoFactoryTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoFactoryTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import java.math.BigInteger;
 import java.util.*;
@@ -29,13 +30,6 @@
 import javax.xml.crypto.dsig.keyinfo.*;
 import javax.xml.crypto.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.KeyInfoFactory
  *
@@ -75,7 +69,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(factory.isFeatureSupported("not supported"));
+        assertTrue(!factory.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
@@ -148,7 +142,7 @@
 
         // test newPGPData(byte[])
         PGPData pd = factory.newPGPData(valid_id);
-        assertArrayEquals(valid_id, pd.getKeyId());
+        assertTrue(Arrays.equals(valid_id, pd.getKeyId()));
         try {
             pd = factory.newPGPData(invalid_id);
             fail("Should throw IAE for invalid key id values");
@@ -156,8 +150,8 @@
 
         // test newPGPData(byte[], byte[], List)
         pd = factory.newPGPData(valid_id, valid_packet, null);
-        assertArrayEquals(valid_id, pd.getKeyId());
-        assertArrayEquals(valid_packet, pd.getKeyPacket());
+        assertTrue(Arrays.equals(valid_id, pd.getKeyId()));
+        assertTrue(Arrays.equals(valid_packet, pd.getKeyPacket()));
         try {
             pd = factory.newPGPData(invalid_id, valid_packet, null);
             fail("Should throw IAE for invalid key id values");
@@ -173,7 +167,7 @@
 
         // test newPGPData(byte[], List)
         pd = factory.newPGPData(valid_packet, null);
-        assertArrayEquals(valid_packet, pd.getKeyPacket());
+        assertTrue(Arrays.equals(valid_packet, pd.getKeyPacket()));
         try {
             pd = factory.newPGPData(invalid_packet, null);
             fail("Should throw IAE for invalid key packet values");
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoTest.java
index 587afc1..f1b0a2a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyInfoTest.java
@@ -21,6 +21,7 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import java.security.Key;
 import java.util.Collections;
@@ -37,12 +38,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.KeyInfo
  *
@@ -108,7 +103,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(ki.isFeatureSupported("not supported"));
+        assertTrue(!ki.isFeatureSupported("not supported"));
     }
 
     @org.junit.Test
@@ -120,7 +115,7 @@
             fail("Should raise a NullPointerException");
         } catch (NullPointerException npe) {}
 
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Element elem = doc.createElementNS("http://acme.org", "parent");
         doc.appendChild(elem);
         DOMStructure parent = new DOMStructure(elem);
@@ -131,16 +126,16 @@
         }
 
         Element kiElem = DOMUtils.getFirstChildElement(elem);
-        if (!"KeyInfo".equals(kiElem.getLocalName())) {
+        if (!kiElem.getLocalName().equals("KeyInfo")) {
             fail("Should be KeyInfo element: " + kiElem.getLocalName());
         }
         Element knElem = DOMUtils.getFirstChildElement(kiElem);
-        if (!"KeyName".equals(knElem.getLocalName())) {
+        if (!knElem.getLocalName().equals("KeyName")) {
             fail("Should be KeyName element: " + knElem.getLocalName());
         }
 
         // check if key info is inserted before nextSibling
-        doc = XMLUtils.newDocument();
+        doc = XMLUtils.createDocumentBuilder(false).newDocument();
         elem = doc.createElementNS("http://acme.org", "parent");
         doc.appendChild(elem);
         Element nextSib = doc.createElementNS("http://acme.org", "nextSib");
@@ -156,7 +151,7 @@
 
             @Override
             public byte[] getEncoded() {
-                return new byte[0];
+                return null;
             }
 
             @Override
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyNameTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyNameTest.java
index e9dcd83..64d5e57 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyNameTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyNameTest.java
@@ -21,15 +21,10 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.KeyName
  *
@@ -68,6 +63,6 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(kn.isFeatureSupported("not supported"));
+        assertTrue(!kn.isFeatureSupported("not supported"));
     }
 }
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyValueTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyValueTest.java
index 502d0ca..ffa5553 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyValueTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/KeyValueTest.java
@@ -21,16 +21,11 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import java.security.*;
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.KeyValue
  *
@@ -86,7 +81,7 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(kv.isFeatureSupported("not supported"));
+        assertTrue(!kv.isFeatureSupported("not supported"));
     }
 
     private PublicKey genPublicKey(String algo, int keysize) throws Exception {
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/PGPDataTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/PGPDataTest.java
index 91d4fbc..51e97c9 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/PGPDataTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/PGPDataTest.java
@@ -21,18 +21,14 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import javax.xml.crypto.*;
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.PGPData
  *
@@ -109,27 +105,30 @@
     public void testConstructor() {
         // test newPGPKeyData(byte[])
         PGPData pd = fac.newPGPData(values[0]);
-        assertArrayEquals(values[0], pd.getKeyId());
+        assertTrue(Arrays.equals(values[0], pd.getKeyId()));
 
         // test newPGPData(byte[], byte[], List)
         pd = fac.newPGPData(values[0], values[1], null);
-        assertArrayEquals(values[0], pd.getKeyId());
-        assertArrayEquals(values[1], pd.getKeyPacket());
+        assertTrue(Arrays.equals(values[0], pd.getKeyId()));
+        assertTrue(Arrays.equals(values[1], pd.getKeyPacket()));
 
         // test newPGPData(byte[], List)
         pd = fac.newPGPData(values[1], null);
-        assertArrayEquals(values[1], pd.getKeyPacket());
+        assertTrue(Arrays.equals(values[1], pd.getKeyPacket()));
     }
 
     @org.junit.Test
     public void testisFeatureSupported() {
         PGPData pd = null;
         for (int i = 0; i < 3; i++) {
-            if (i == 0) {
+            switch (i) {
+            case 0:
                 pd = fac.newPGPData(values[0]);
-            } else if (i == 1) {
+                break;
+            case 1:
                 pd = fac.newPGPData(values[0], values[1], null);
-            } else {
+                break;
+            case 2:
                 pd = fac.newPGPData(values[1], null);
             }
             try {
@@ -137,7 +136,7 @@
                 fail("Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
 
-            assertFalse(pd.isFeatureSupported("not supported"));
+            assertTrue(!pd.isFeatureSupported("not supported"));
         }
     }
 
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/RetrievalMethodTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/RetrievalMethodTest.java
index 201d8e2..98d325a 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/RetrievalMethodTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/RetrievalMethodTest.java
@@ -21,16 +21,10 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.RetrievalMethod
  *
@@ -92,17 +86,20 @@
         String type = "http://www.w3.org/2000/09/xmldsig#X509Data";
         RetrievalMethod rm = null;
         for (int i = 0; i < 2; i++) {
-            if (i == 0) {
+            switch (i) {
+            case 0:
                 rm = fac.newRetrievalMethod(uri);
-            } else if (i == 1) {
+                break;
+            case 1:
                 rm = fac.newRetrievalMethod(uri, type, null);
+                break;
             }
             try {
                 rm.isFeatureSupported(null);
                 fail("Should raise a NPE for null feature");
             } catch (NullPointerException npe) {}
 
-            assertFalse(rm.isFeatureSupported("not supported"));
+            assertTrue(!rm.isFeatureSupported("not supported"));
         }
     }
 }
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509DataTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509DataTest.java
index 38d64aa..5875e21 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509DataTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509DataTest.java
@@ -24,16 +24,12 @@
 import java.util.*;
 import java.security.cert.X509Certificate;
 
+import static org.junit.Assert.*;
 
 import java.security.cert.X509CRL;
 import javax.xml.crypto.*;
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.X509Data
  *
@@ -82,6 +78,6 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(x509.isFeatureSupported("not supported"));
+        assertTrue(!x509.isFeatureSupported("not supported"));
     }
 }
diff --git a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509IssuerSerialTest.java b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509IssuerSerialTest.java
index de42ad4..68b10a6 100644
--- a/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509IssuerSerialTest.java
+++ b/src/test/java/javax/xml/crypto/test/dsig/keyinfo/X509IssuerSerialTest.java
@@ -21,16 +21,11 @@
  */
 package javax.xml.crypto.test.dsig.keyinfo;
 
+import static org.junit.Assert.*;
 
 import java.math.BigInteger;
 import javax.xml.crypto.dsig.keyinfo.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 /**
  * Unit test for javax.xml.crypto.dsig.keyinfo.X509IssuerSerial
  *
@@ -92,6 +87,6 @@
             fail("Should raise a NPE for null feature");
         } catch (NullPointerException npe) {}
 
-        assertFalse(x509is.isFeatureSupported("not supported"));
+        assertTrue(!x509is.isFeatureSupported("not supported"));
     }
 }
diff --git a/src/test/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImplTest.java b/src/test/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImplTest.java
index 01a1662..885bdff 100644
--- a/src/test/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImplTest.java
+++ b/src/test/java/org/apache/xml/security/stax/impl/securityToken/SecurityTokenFactoryImplTest.java
@@ -41,8 +41,7 @@
 
 import static org.apache.xml.security.stax.securityToken.SecurityTokenConstants.KeyIdentifier_KeyName;
 import static org.apache.xml.security.test.stax.utils.KeyLoader.loadPublicKey;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
 
 public class SecurityTokenFactoryImplTest {
     private KeyInfoType keyInfoType;
@@ -139,4 +138,4 @@
         factory.getSecurityToken(keyInfoType, keyUsage, xmlSecurityProperties, inboundSecurityContext);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/CreateExclC14nInteropValues.java b/src/test/java/org/apache/xml/security/test/dom/CreateExclC14nInteropValues.java
index ca46809..9909c35 100644
--- a/src/test/java/org/apache/xml/security/test/dom/CreateExclC14nInteropValues.java
+++ b/src/test/java/org/apache/xml/security/test/dom/CreateExclC14nInteropValues.java
@@ -25,6 +25,8 @@
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.signature.ObjectContainer;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.transforms.Transforms;
@@ -46,11 +48,12 @@
      * @param unused
      * @throws Exception
      */
-    public static void main(String[] unused) throws Exception {
+    public static void main(String unused[]) throws Exception {
 
         org.apache.xml.security.Init.init();
 
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
         String directory = "data/org/apache/xml/security/c14n/outExcl/";
         File signatureFile = new File(directory + "apacheSignature.xml");
         XMLSignature xmlSignature = new XMLSignature(doc,
@@ -197,7 +200,7 @@
             + "\n" + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
@@ -232,7 +235,7 @@
             + "\n" + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
@@ -267,7 +270,7 @@
             + "\n" + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
@@ -303,7 +306,7 @@
             + "\n" + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
@@ -340,7 +343,7 @@
             + "</included>" + "\n" + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
@@ -377,7 +380,7 @@
             + "</included>";
             Document importDoc = null;
             try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
-                importDoc = XMLUtils.read(is, false);
+                importDoc = db.parse(is);
             }
 
             obj.getElement().appendChild(doc.createTextNode("\n"));
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/DigestAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/DigestAlgorithmTest.java
index ac61b00..eeeb4e1 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/DigestAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/DigestAlgorithmTest.java
@@ -18,22 +18,18 @@
  */
 package org.apache.xml.security.test.dom.algorithms;
 
+import static org.junit.Assert.*;
 
 import java.lang.reflect.Constructor;
 import java.security.MessageDigest;
 import java.security.Provider;
 import java.security.Security;
+import java.util.Arrays;
 
 import org.apache.xml.security.algorithms.MessageDigestAlgorithm;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-
 /**
  * A test to make sure that the various digest algorithms are working
  */
@@ -73,7 +69,7 @@
 
     @org.junit.Test
     public void testSHA1() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1);
@@ -86,12 +82,12 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA-1");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA224() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA224);
@@ -104,12 +100,12 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA-224");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA256() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA256);
@@ -122,12 +118,12 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA-256");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA384() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA384);
@@ -140,12 +136,12 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA-384");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA512() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA512);
@@ -158,12 +154,12 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA-512");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testMD5() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5);
@@ -176,13 +172,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("MD5");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testRIPEMD160() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_RIPEMD160);
@@ -195,13 +191,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("RIPEMD160");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testWhirlpool() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_WHIRLPOOL);
@@ -214,13 +210,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("WHIRLPOOL");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA3_224() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA3_224);
@@ -233,13 +229,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA3-224");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA3_256() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA3_256);
@@ -252,13 +248,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA3-256");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA3_384() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA3_384);
@@ -271,13 +267,13 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA3-384");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
     @org.junit.Test
     public void testSHA3_512() throws Exception {
         org.junit.Assume.assumeTrue(bcInstalled);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
 
         MessageDigestAlgorithm digestAlgorithm =
             MessageDigestAlgorithm.getInstance(doc, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA3_512);
@@ -290,7 +286,7 @@
         // Now compare against a JDK MessageDigest Object
         MessageDigest md = MessageDigest.getInstance("SHA3-512");
         byte[] digest2 = md.digest("test-string".getBytes());
-        assertArrayEquals(digest, digest2);
+        assertTrue(Arrays.equals(digest, digest2));
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/HMACSignatureAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/HMACSignatureAlgorithmTest.java
index c69e5af..59c3c9d 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/HMACSignatureAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/HMACSignatureAlgorithmTest.java
@@ -30,6 +30,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -38,18 +39,16 @@
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various Signature HMAC algorithms are working
  */
-public class HMACSignatureAlgorithmTest {
+public class HMACSignatureAlgorithmTest extends Assert {
 
     static {
         org.apache.xml.security.Init.init();
@@ -90,7 +89,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -110,7 +110,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -130,7 +131,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -150,7 +152,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -170,7 +173,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -190,7 +194,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -212,7 +217,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -248,7 +254,7 @@
                     (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
             for (int i = 0; i < elementsToSign.getLength(); i++) {
                 Element elementToSign = (Element)elementsToSign.item(i);
-                assertNotNull(elementToSign);
+                Assert.assertNotNull(elementToSign);
                 String id = UUID.randomUUID().toString();
                 elementToSign.setAttributeNS(null, "Id", id);
                 elementToSign.setIdAttributeNS(null, "Id", true);
@@ -265,7 +271,7 @@
         String expression = "//ds:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         return sig;
     }
@@ -291,19 +297,19 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
             (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         for (String name : localNames) {
             expression = "//*[local-name()='" + name + "']";
             Element signedElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(signedElement);
+            Assert.assertNotNull(signedElement);
             signedElement.setIdAttributeNS(null, "Id", true);
         }
 
         XMLSignature signature = new XMLSignature(sigElement, "", secureValidation);
 
-        assertTrue(signature.checkSignatureValue(key));
+        Assert.assertTrue(signature.checkSignatureValue(key));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/JCEMapperTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/JCEMapperTest.java
deleted file mode 100644
index 21c62f2..0000000
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/JCEMapperTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.xml.security.test.dom.algorithms;
-
-import org.apache.xml.security.algorithms.JCEMapper;
-import org.apache.xml.security.algorithms.MessageDigestAlgorithm;
-
-import static org.junit.Assert.assertEquals;
-
-public class JCEMapperTest {
-
-    static {
-        org.apache.xml.security.Init.init();
-    }
-
-    @org.junit.Test
-    public void testSHA1() throws Exception {
-        assertEquals("MessageDigest", JCEMapper.getAlgorithmClassFromURI(MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1));
-        assertEquals("SHA-1", JCEMapper.translateURItoJCEID(MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1));
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/KeyWrapEncryptionAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/KeyWrapEncryptionAlgorithmTest.java
index 2c53002..ebd4096 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/KeyWrapEncryptionAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/KeyWrapEncryptionAlgorithmTest.java
@@ -30,6 +30,7 @@
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -41,19 +42,16 @@
 import org.apache.xml.security.stax.ext.XMLSecurityConstants;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various KeyWrap Encryption algorithms are working
  */
-public class KeyWrapEncryptionAlgorithmTest {
+public class KeyWrapEncryptionAlgorithmTest extends Assert {
 
     private static KeyPair rsaKeyPair;
     private static boolean bcInstalled;
@@ -97,7 +95,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -121,14 +120,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -137,7 +136,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -161,14 +161,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -177,7 +177,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -201,14 +202,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -217,7 +218,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -239,14 +241,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -255,7 +257,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -275,14 +278,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -291,7 +294,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -311,14 +315,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -327,7 +331,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -347,14 +352,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -365,7 +370,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -389,14 +395,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -407,7 +413,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -431,14 +438,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -449,7 +456,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -473,14 +481,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -491,7 +499,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("SEED");
@@ -515,14 +524,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     private void encrypt(
@@ -551,7 +560,7 @@
             String expression = "//*[local-name()='" + localName + "']";
             Element elementToEncrypt =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(elementToEncrypt);
+            Assert.assertNotNull(elementToEncrypt);
 
             document = cipher.doFinal(document, elementToEncrypt, false);
         }
@@ -560,7 +569,7 @@
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertTrue(nodeList.getLength() > 0);
+        Assert.assertTrue(nodeList.getLength() > 0);
     }
 
     private Document decrypt(
@@ -592,4 +601,4 @@
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/PKSignatureAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/PKSignatureAlgorithmTest.java
index 98db30e..cf92e8e 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/PKSignatureAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/PKSignatureAlgorithmTest.java
@@ -29,6 +29,7 @@
 import java.util.List;
 import java.util.UUID;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -37,18 +38,16 @@
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various Public Key Signature algorithms are working
  */
-public class PKSignatureAlgorithmTest {
+public class PKSignatureAlgorithmTest extends Assert {
 
     private static KeyPair rsaKeyPair, ecKeyPair;
     private static boolean bcInstalled;
@@ -96,7 +95,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -112,7 +112,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -128,7 +129,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -144,7 +146,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -160,7 +163,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -176,7 +180,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -194,7 +199,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -212,7 +218,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -230,7 +237,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -248,7 +256,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -266,7 +275,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -284,7 +294,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -302,7 +313,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -320,7 +332,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -338,7 +351,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -356,7 +370,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -372,7 +387,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -388,7 +404,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -404,7 +421,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -420,7 +438,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -436,7 +455,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -454,7 +474,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         List<String> localNames = new ArrayList<>();
         localNames.add("PaymentInfo");
@@ -486,7 +507,7 @@
                     (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
             for (int i = 0; i < elementsToSign.getLength(); i++) {
                 Element elementToSign = (Element)elementsToSign.item(i);
-                assertNotNull(elementToSign);
+                Assert.assertNotNull(elementToSign);
                 String id = UUID.randomUUID().toString();
                 elementToSign.setAttributeNS(null, "Id", id);
                 elementToSign.setIdAttributeNS(null, "Id", true);
@@ -503,7 +524,7 @@
         String expression = "//ds:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         return sig;
     }
@@ -529,19 +550,19 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
             (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         for (String name : localNames) {
             expression = "//*[local-name()='" + name + "']";
             Element signedElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(signedElement);
+            Assert.assertNotNull(signedElement);
             signedElement.setIdAttributeNS(null, "Id", true);
         }
 
         XMLSignature signature = new XMLSignature(sigElement, "", secureValidation);
 
-        assertTrue(signature.checkSignatureValue(key));
+        Assert.assertTrue(signature.checkSignatureValue(key));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/SignatureAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/SignatureAlgorithmTest.java
index 7dd143b..c91219a 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/SignatureAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/SignatureAlgorithmTest.java
@@ -38,7 +38,7 @@
 
     @org.junit.Test
     public void testSameKeySeveralAlgorithmSigning() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         SignatureAlgorithm signatureAlgorithm =
             new SignatureAlgorithm(doc, XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1);
         PrivateKey pk = KeyPairGenerator.getInstance("RSA").genKeyPair().getPrivate();
diff --git a/src/test/java/org/apache/xml/security/test/dom/algorithms/SymmetricEncryptionAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/algorithms/SymmetricEncryptionAlgorithmTest.java
index b9f4661..bc05e05 100644
--- a/src/test/java/org/apache/xml/security/test/dom/algorithms/SymmetricEncryptionAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/algorithms/SymmetricEncryptionAlgorithmTest.java
@@ -28,6 +28,7 @@
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -36,19 +37,16 @@
 import org.apache.xml.security.stax.ext.XMLSecurityConstants;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various Symmetric Encryption algorithms are working
  */
-public class SymmetricEncryptionAlgorithmTest {
+public class SymmetricEncryptionAlgorithmTest extends Assert {
 
     private static boolean bcInstalled;
 
@@ -89,7 +87,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -105,14 +104,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -121,7 +120,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -137,14 +137,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -153,7 +153,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -169,14 +170,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -185,7 +186,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -201,14 +203,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -217,7 +219,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -233,14 +236,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -249,7 +252,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -265,14 +269,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -281,7 +285,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -296,14 +301,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -314,7 +319,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("SEED");
@@ -330,14 +336,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -348,7 +354,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -364,14 +371,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -382,7 +389,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -398,14 +406,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @org.junit.Test
@@ -416,7 +424,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -432,14 +441,14 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
         document = decrypt(encryptionAlgorithm, document, key);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     private void encrypt(
@@ -459,7 +468,7 @@
             String expression = "//*[local-name()='" + localName + "']";
             Element elementToEncrypt =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(elementToEncrypt);
+            Assert.assertNotNull(elementToEncrypt);
 
             document = cipher.doFinal(document, elementToEncrypt, false);
         }
@@ -468,7 +477,7 @@
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertTrue(nodeList.getLength() > 0);
+        Assert.assertTrue(nodeList.getLength() > 0);
     }
 
     private Document decrypt(
@@ -487,4 +496,4 @@
         return cipher.doFinal(document, ee);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/helper/AttrCompareTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/helper/AttrCompareTest.java
index 3a5022d..d5b2f7c 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/helper/AttrCompareTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/helper/AttrCompareTest.java
@@ -18,7 +18,9 @@
  */
 package org.apache.xml.security.test.dom.c14n.helper;
 
+import static org.junit.Assert.*;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.xml.security.c14n.helper.AttrCompare;
@@ -29,11 +31,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-
 
 /**
  * Unit test for {@link org.apache.xml.security.c14n.AttrCompare#compare}
@@ -221,7 +218,9 @@
     private static Document createDoc(
         String documentElement
     ) throws ParserConfigurationException {
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(false);
+
+        Document doc = documentBuilder.newDocument();
         Element root = doc.createElementNS(null, documentElement);
 
         doc.appendChild(root);
@@ -230,3 +229,5 @@
     }
 
 }
+
+
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/helper/C14nHelperTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/helper/C14nHelperTest.java
index 7b08aef..44d11be 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/helper/C14nHelperTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/helper/C14nHelperTest.java
@@ -18,11 +18,10 @@
  */
 package org.apache.xml.security.test.dom.c14n.helper;
 
+import static org.junit.Assert.assertTrue;
 
 import org.apache.xml.security.c14n.helper.C14nHelper;
 
-import static org.junit.Assert.assertTrue;
-
 
 /**
  */
@@ -109,4 +108,4 @@
                    C14nHelper.namespaceIsRelative(namespaceURI));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Bug45961Test.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Bug45961Test.java
index b955f08..a68b567 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Bug45961Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Bug45961Test.java
@@ -18,12 +18,15 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.*;
 
 import java.io.FileInputStream;
 import java.security.KeyStore;
 import java.security.PrivateKey;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.Init;
 import org.apache.xml.security.c14n.Canonicalizer;
 import org.apache.xml.security.keys.KeyInfo;
@@ -37,10 +40,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-
 public class Bug45961Test {
 
     private static final String OBJECT_ID = "Object";
@@ -48,12 +47,14 @@
         MockCanonicalizationMethod.MOCK_CANONICALIZATION_METHOD;
     private static final char[] PASSWORD = "changeit".toCharArray();
     private static final String ALIAS = "mullan";
+    private DocumentBuilder _builder;
     private ObjectContainer object;
 
     public Bug45961Test() throws Exception {
         Init.init();
         Canonicalizer.register(MOCK_CANONICALIZATION_METHOD,
                                MockCanonicalizationMethod.class.getName());
+        _builder = XMLUtils.createDocumentBuilder(false);
     }
 
     @org.junit.Test
@@ -83,7 +84,7 @@
         X509Certificate signingCert = (X509Certificate) ks
         .getCertificate(ALIAS);
 
-        Document document = XMLUtils.newDocument();
+        Document document = _builder.newDocument();
 
         XMLSignature signature = new XMLSignature(document, null,
                                                   XMLSignature.ALGO_ID_SIGNATURE_DSA,
@@ -125,4 +126,4 @@
         return path;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer11Test.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer11Test.java
index 326bd33..366cd81 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer11Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer11Test.java
@@ -18,25 +18,33 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
+import org.apache.xml.security.c14n.CanonicalizationException;
 import org.apache.xml.security.c14n.Canonicalizer;
+import org.apache.xml.security.c14n.InvalidCanonicalizerException;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
+import org.apache.xml.security.utils.IgnoreAllErrorHandler;
 import org.apache.xml.security.utils.JavaUtils;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.xml.sax.SAXException;
 
 /**
  * Unit test for
@@ -64,9 +72,21 @@
 
     /**
      * 3.1 PIs, Comments, and Outside of Document Element
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test31withCommentsSubtree() throws Exception {
+    public void test31withCommentsSubtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.1: PIs, Comments, and Outside of Document Element. (commented)";
 
@@ -74,116 +94,189 @@
         String fileRef = prefix + "in/31_c14n-comments.xml";
         String fileOut = prefix + "out/xpath_31_output-comments.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_WITH_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.2 Whitespace in Document Content
-
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-WhitespaceInContent">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test32subtree() throws Exception {
+    public void test32subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.2 Whitespace in Document Content. (uncommented)";
         String fileIn = prefix + "in/32_input.xml";
         String fileRef = prefix + "in/32_c14n.xml";
         String fileOut = prefix + "out/xpath_32_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.3 Start and End Tags
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-SETags">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test33subtree() throws Exception  {
+    public void test33subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.3 Start and End Tags. (uncommented)";
         String fileIn = prefix + "in/33_input.xml";
         String fileRef = prefix + "in/33_c14n.xml";
         String fileOut = prefix + "out/xpath_33_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;    // Canonicalizer.XPATH_C14N_OMIT_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.4 Character Modifications and Character References
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see #test34validatingParser
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test34() throws Exception {
+    public void test34()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.4 Character Modifications and Character References. (uncommented)";
         String fileIn = prefix + "in/34_input.xml";
         String fileRef = prefix + "in/34_c14n.xml";
         String fileOut = prefix + "out/xpath_34_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = false;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.5 Entity References
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Entities">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test35subtree() throws Exception {
+    public void test35subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.5 Entity References. (uncommented)";
         String fileIn = prefix + "in/35_input.xml";
         String fileRef = prefix + "in/35_c14n.xml";
         String fileOut = prefix + "out/xpath_35_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.6 UTF-8 Encoding
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-UTF8">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test36subtree() throws Exception {
+    public void test36subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.6 UTF-8 Encoding. (uncommented)";
         String fileIn = prefix + "in/36_input.xml";
         String fileRef = prefix + "in/36_c14n.xml";
         String fileOut = prefix + "out/xpath_36_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.7 Document Subsets
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-DocSubsets">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test37() throws Exception {
+    public void test37()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.7 Document Subsets. (uncommented)";
         String fileIn = prefix + "in/37_input.xml";
         String fileRef = prefix + "in/37_c14n.xml";
         String fileOut = prefix + "out/xpath_37_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
 
         Map<String, String> namespace = new HashMap<>();
         namespace.put("ietf", "http://www.ietf.org");
@@ -196,19 +289,32 @@
             + "]";
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath, namespace));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath, namespace));
     }
 
     /**
      * 3.8 Document Subsets and XML Attributes
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test38() throws Exception {
+    public void test38()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.8 Document Subsets and XML Attributes (uncommented)";
         String fileIn = prefix + "in/38_input.xml";
         String fileRef = prefix + "in/38_c14n.xml";
         String fileOut = prefix + "out/xpath_38_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+        boolean validating = true;
 
         Map<String, String> namespace = new HashMap<>();
         namespace.put("ietf", "http://www.ietf.org");
@@ -221,7 +327,7 @@
             + "]";
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath, namespace));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath, namespace));
     }
 
     private boolean c14nAndCompare(
@@ -229,11 +335,14 @@
                                    String fileRef,
                                    String fileOut,
                                    String c14nURI,
+                                   boolean validating,
                                    String xpath
-                               ) throws Exception {
+                               ) throws IOException, FileNotFoundException, SAXException,
+                                   ParserConfigurationException, CanonicalizationException,
+                                   InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         Map<String, String> namespace = new HashMap<>();
         return c14nAndCompare(fileIn, fileRef, fileOut,
-            c14nURI, xpath, namespace);
+            c14nURI, validating, xpath, namespace);
     }
 
     private boolean c14nAndCompare(
@@ -241,14 +350,27 @@
         String fileRef,
         String fileOut,
         String c14nURI,
+        boolean validating,
         String xpath,
         Map<String, String> namespaces
-    ) throws Exception {
+    ) throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
 
-        Document doc = XMLUtils.read(fileIn, false);
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(validating, false);
+
+        // throw away all warnings and errors
+        documentBuilder.setErrorHandler(new IgnoreAllErrorHandler());
+
+        // org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+        // documentBuilder.setEntityResolver(resolver);
+        // Document doc = documentBuilder.parse(resolver.resolveEntity(null, fileIn));
+
+        Document doc = documentBuilder.parse(fileIn);
+
 
         Canonicalizer c14n = Canonicalizer.getInstance(c14nURI);
-        byte[] c14nBytes = null;
+        byte c14nBytes[] = null;
 
         if (xpath == null) {
             c14nBytes = c14n.canonicalizeSubtree(doc);
@@ -267,8 +389,8 @@
         }
 
         // org.xml.sax.InputSource refIs = resolver.resolveEntity(null, fileRef);
-        // byte[] refBytes = JavaUtils.getBytesFromStream(refIs.getByteStream());
-        byte[] refBytes = JavaUtils.getBytesFromFile(fileRef);
+        // byte refBytes[] = JavaUtils.getBytesFromStream(refIs.getByteStream());
+        byte refBytes[] = JavaUtils.getBytesFromFile(fileRef);
 
         // if everything is OK, result is true; we do a binary compare, byte by byte
         boolean result = java.security.MessageDigest.isEqual(refBytes, c14nBytes);
@@ -291,4 +413,4 @@
         return result;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315ExclusiveTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315ExclusiveTest.java
index 361f6ab..83b1100 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315ExclusiveTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315ExclusiveTest.java
@@ -18,23 +18,33 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.StringReader;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
+import org.apache.xml.security.c14n.CanonicalizationException;
+import org.apache.xml.security.c14n.InvalidCanonicalizerException;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315Excl;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315ExclOmitComments;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315ExclWithComments;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315WithComments;
+import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.signature.XMLSignature;
+import org.apache.xml.security.signature.XMLSignatureException;
 import org.apache.xml.security.signature.XMLSignatureInput;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.utils.Constants;
@@ -45,9 +55,7 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.xml.sax.SAXException;
 
 
 /**
@@ -63,11 +71,34 @@
             Canonicalizer20010315ExclusiveTest.class
         );
 
+    /** Field db */
+    DocumentBuilder db;
+
+    public Canonicalizer20010315ExclusiveTest() throws ParserConfigurationException {
+        this.db = XMLUtils.createDocumentBuilder(false);
+    }
+
     /**
      * Method testA
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
+     * @throws org.apache.xml.security.keys.keyresolver.KeyResolverException
      */
     @org.junit.Test
-    public void testA() throws Exception {
+    public void testA()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException,
+        org.apache.xml.security.keys.keyresolver.KeyResolverException {
 
         File fileIn = new File(getAbsolutePath(
             "src/test/resources/ie/baltimore/merlin-examples/ec-merlin-iaikTests-two/signature.xml"));
@@ -75,7 +106,7 @@
         // File fileIn = new File("signature.xml");
         assertTrue("file exists", fileIn.exists());
 
-        Document doc = XMLUtils.read(new FileInputStream(fileIn), false);
+        Document doc = this.db.parse(fileIn);
         Element signatureElement =
             (Element) doc.getElementsByTagNameNS(
                 Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0);
@@ -101,14 +132,27 @@
 
     /**
      * Method test221
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
      */
     @org.junit.Test
-    public void test221() throws Exception {
+    public void test221()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException {
 
         Document doc =
-            XMLUtils.read(
-                new FileInputStream(getAbsolutePath("src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_1.xml")),
-                false
+            this.db.parse(
+                getAbsolutePath("src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_1.xml")
             );
         Node root = doc.getElementsByTagNameNS("http://example.net", "elem2").item(0);
         Canonicalizer20010315 c = new Canonicalizer20010315WithComments();
@@ -122,13 +166,27 @@
 
     /**
      * Method test222
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
      */
     @org.junit.Test
-    public void test222() throws Exception {
+    public void test222()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException {
         Document doc =
-            XMLUtils.read(new FileInputStream(getAbsolutePath(
+            this.db.parse(getAbsolutePath(
                 "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_2.xml")
-            ), false);
+            );
         Node root = doc.getElementsByTagNameNS("http://example.net", "elem2").item(0);
         Canonicalizer20010315 c = new Canonicalizer20010315WithComments();
         byte[] reference = JavaUtils.getBytesFromFile(getAbsolutePath(
@@ -141,13 +199,26 @@
 
     /**
      * Method test221excl
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
      */
     @org.junit.Test
-    public void test221excl() throws Exception {
+    public void test221excl()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException {
         Document doc =
-            XMLUtils.read(new FileInputStream(getAbsolutePath(
-                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_1.xml")),
-                          false);
+            this.db.parse(getAbsolutePath(
+                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_1.xml"));
         Node root = doc.getElementsByTagNameNS("http://example.net", "elem2").item(0);
         Canonicalizer20010315Excl c = new Canonicalizer20010315ExclWithComments();
         byte[] reference = JavaUtils.getBytesFromFile(getAbsolutePath(
@@ -160,13 +231,26 @@
 
     /**
      * Method test222excl
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
      */
     @org.junit.Test
-    public void test222excl() throws Exception {
+    public void test222excl()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException {
         Document doc =
-            XMLUtils.read(new FileInputStream(getAbsolutePath(
-                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_2.xml")),
-                          false);
+            this.db.parse(getAbsolutePath(
+                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_2.xml"));
         Node root = doc.getElementsByTagNameNS("http://example.net", "elem2").item(0);
         Canonicalizer20010315Excl c = new Canonicalizer20010315ExclWithComments();
         byte[] reference = JavaUtils.getBytesFromFile(getAbsolutePath(
@@ -181,13 +265,27 @@
      * Method test223excl
      *
      * Provided by Gabriel McGoldrick - see e-mail of 21/11/03
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XMLSecurityException
+     * @throws XMLSignatureException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test223excl() throws Exception {
+    public void test223excl()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException,
+        XMLSignatureException, XMLSecurityException, XPathExpressionException {
         Document doc =
-            XMLUtils.read(new FileInputStream(getAbsolutePath(
-                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_3.xml")),
-                          false);
+            this.db.parse(getAbsolutePath(
+                "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_2_3.xml"));
 
         XPathFactory xpf = XPathFactory.newInstance();
         XPath xpath = xpf.newXPath();
@@ -238,7 +336,7 @@
             + "</ns0:Ping>"
             + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
             new Canonicalizer20010315ExclOmitComments();
         Set<Node> nodeSet = new HashSet<>();
@@ -256,10 +354,9 @@
     @org.junit.Test
     public void test24excl() throws Exception {
         Document doc =
-            XMLUtils.read(
-                new FileInputStream(getAbsolutePath(
-                    "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_4.xml")),
-                false);
+            this.db.parse(
+                getAbsolutePath(
+                    "src/test/resources/org/apache/xml/security/c14n/inExcl/example2_4.xml"));
         Node root =
             doc.getElementsByTagNameNS("http://example.net", "elem2").item(0);
         Canonicalizer20010315Excl c = new Canonicalizer20010315ExclWithComments();
@@ -279,7 +376,7 @@
      */
     @org.junit.Test
     public void test24Aexcl() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Element local = doc.createElementNS("foo:bar", "dsig:local");
         Element test = doc.createElementNS("http://example.net", "etsi:test");
         Element elem2 = doc.createElementNS("http://example.net", "etsi:elem2");
@@ -332,7 +429,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         {
             Canonicalizer20010315ExclOmitComments c14n =
                     new Canonicalizer20010315ExclOmitComments();
@@ -395,7 +492,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         {
             Canonicalizer20010315ExclOmitComments c14n =
                     new Canonicalizer20010315ExclOmitComments();
@@ -445,7 +542,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         {
             Canonicalizer20010315ExclOmitComments c14n =
                     new Canonicalizer20010315ExclOmitComments();
@@ -495,7 +592,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         {
             Canonicalizer20010315ExclOmitComments c14n =
                     new Canonicalizer20010315ExclOmitComments();
@@ -545,7 +642,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
                 new Canonicalizer20010315ExclOmitComments();
         byte[] bytes = c14n.engineCanonicalizeSubTree(doc.getDocumentElement().getFirstChild(), "#default", true);
@@ -580,7 +677,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
                 new Canonicalizer20010315ExclOmitComments();
         byte[] bytes = c14n.engineCanonicalizeSubTree(doc.getDocumentElement().getFirstChild(), "#default", true);
@@ -615,7 +712,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
                 new Canonicalizer20010315ExclOmitComments();
         byte[] bytes = c14n.engineCanonicalizeSubTree(doc.getDocumentElement().getFirstChild(), "#default", true);
@@ -650,7 +747,7 @@
                         + "</ns0:Ping>"
                         + "</env:Body>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
                 new Canonicalizer20010315ExclOmitComments();
         byte[] bytes = c14n.engineCanonicalizeSubTree(doc.getDocumentElement().getFirstChild(), "#default", true);
@@ -680,7 +777,7 @@
                         + "<ns0:text xsi:type=\"xsd:string\">hello</ns0:text>"
                         + "</ns0:Ping>";
 
-        Document doc = XMLUtils.read(new InputSource(new StringReader(XML)), false);
+        Document doc = this.db.parse(new InputSource(new StringReader(XML)));
         Canonicalizer20010315ExclOmitComments c14n =
                 new Canonicalizer20010315ExclOmitComments();
         byte[] bytes = c14n.engineCanonicalizeSubTree(doc.getDocumentElement().getFirstChild().getFirstChild(), "#default", true);
@@ -695,4 +792,4 @@
         return path;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315Test.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315Test.java
index fb83ff7..98c00b6 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Canonicalizer20010315Test.java
@@ -18,35 +18,43 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
 import org.apache.xml.security.c14n.CanonicalizationException;
 import org.apache.xml.security.c14n.Canonicalizer;
+import org.apache.xml.security.c14n.InvalidCanonicalizerException;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
+import org.apache.xml.security.test.dom.resource.TestVectorResolver;
+import org.apache.xml.security.utils.IgnoreAllErrorHandler;
 import org.apache.xml.security.utils.JavaUtils;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.xml.sax.SAXException;
 
 
 /**
@@ -76,9 +84,21 @@
 
     /**
      * 3.1 PIs, Comments, and Outside of Document Element
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test31withCommentsSubtree() throws Exception {
+    public void test31withCommentsSubtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.1: PIs, Comments, and Outside of Document Element. (commented)";
 
@@ -86,17 +106,30 @@
         String fileRef = prefix + "in/31_c14n-comments.xml";
         String fileOut = prefix + "out/xpath_31_output-comments.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.1 PIs, Comments, and Outside of Document Element
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test31withCommentsSubset() throws Exception {
+    public void test31withCommentsSubset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.1: PIs, Comments, and Outside of Document Element. (commented)";
 
@@ -104,38 +137,62 @@
         String fileRef = prefix + "in/31_c14n-comments.xml";
         String fileOut = prefix + "out/xpath_31_output-comments.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.1 PIs, Comments, and Outside of Document Element
-
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-OutsideDoc">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test31subtree() throws Exception {
+    public void test31subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.1: PIs, Comments, and Outside of Document Element. (uncommented)";
         String fileIn = prefix + "in/31_input.xml";
         String fileRef = prefix + "in/31_c14n.xml";
         String fileOut = prefix + "out/xpath_31_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.1 PIs, Comments, and Outside of Document Element
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-OutsideDoc">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test31subset() throws Exception {
+    public void test31subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
 
         String descri =
             "3.1: PIs, Comments, and Outside of Document Element. (uncommented)";
@@ -143,97 +200,150 @@
         String fileRef = prefix + "in/31_c14n.xml";
         String fileOut = prefix + "out/xpath_31_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.2 Whitespace in Document Content
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-WhitespaceInContent">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test32subtree() throws Exception {
+    public void test32subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.2 Whitespace in Document Content. (uncommented)";
         String fileIn = prefix + "in/32_input.xml";
         String fileRef = prefix + "in/32_c14n.xml";
         String fileOut = prefix + "out/xpath_32_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.2 Whitespace in Document Content
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-WhitespaceInContent">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test32subset() throws Exception {
+    public void test32subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.2 Whitespace in Document Content. (uncommented)";
         String fileIn = prefix + "in/32_input.xml";
         String fileRef = prefix + "in/32_c14n.xml";
         String fileOut = prefix + "out/xpath_32_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.3 Start and End Tags
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-SETags">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test33subtree() throws Exception {
+    public void test33subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.3 Start and End Tags. (uncommented)";
         String fileIn = prefix + "in/33_input.xml";
         String fileRef = prefix + "in/33_c14n.xml";
         String fileOut = prefix + "out/xpath_33_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;    // Canonicalizer.XPATH_C14N_OMIT_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     @org.junit.Test
-    public void test33subset() throws Exception {
+    public void test33subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.3 Start and End Tags. (uncommented)";
         String fileIn = prefix + "in/33_input.xml";
         String fileRef = prefix + "in/33_c14n.xml";
         String fileOut = prefix + "out/xpath_33_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.4 Character Modifications and Character References
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see #test34validatingParser
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test34() throws Exception {
+    public void test34()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.4 Character Modifications and Character References. (uncommented)";
         String fileIn = prefix + "in/34_input.xml";
         String fileRef = prefix + "in/34_c14n.xml";
         String fileOut = prefix + "out/xpath_34_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = false;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
@@ -247,20 +357,32 @@
      * containing this element from the input and canonical form. In general,
      * XML consumers should be discouraged from using this feature of XML.
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test34subtree() throws Exception {
+    public void test34subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri =
             "3.4 Character Modifications and Character References. (uncommented, patched to run on validating Parsers)";
         String fileIn = prefix + "in/34_input_validatingParser.xml";
         String fileRef = prefix + "in/34_c14n_validatingParser.xml";
         String fileOut = prefix + "out/xpath_34_output_validatingParser.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
@@ -274,10 +396,21 @@
      * containing this element from the input and canonical form. In general,
      * XML consumers should be discouraged from using this feature of XML.
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Chars">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test34subset() throws Exception {
+    public void test34subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
 
         String descri =
             "3.4 Character Modifications and Character References. (uncommented, patched to run on validating Parsers)";
@@ -285,96 +418,157 @@
         String fileRef = prefix + "in/34_c14n_validatingParser.xml";
         String fileOut = prefix + "out/xpath_34_output_validatingParser.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.5 Entity References
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Entities">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test35subtree() throws Exception{
+    public void test35subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.5 Entity References. (uncommented)";
         String fileIn = prefix + "in/35_input.xml";
         String fileRef = prefix + "in/35_c14n.xml";
         String fileOut = prefix + "out/xpath_35_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.5 Entity References
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-Entities">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test35subset() throws Exception {
+    public void test35subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.5 Entity References. (uncommented)";
         String fileIn = prefix + "in/35_input.xml";
         String fileRef = prefix + "in/35_c14n.xml";
         String fileOut = prefix + "out/xpath_35_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.6 UTF-8 Encoding
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-UTF8">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test36subtree() throws Exception {
+    public void test36subtree()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.6 UTF-8 Encoding. (uncommented)";
         String fileIn = prefix + "in/36_input.xml";
         String fileRef = prefix + "in/36_c14n.xml";
         String fileOut = prefix + "out/xpath_36_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = null;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.6 UTF-8 Encoding
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-UTF8">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test36subset() throws Exception {
+    public void test36subset()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.6 UTF-8 Encoding. (uncommented)";
         String fileIn = prefix + "in/36_input.xml";
         String fileRef = prefix + "in/36_c14n.xml";
         String fileOut = prefix + "out/xpath_36_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
         String xpath = Canonicalizer.XPATH_C14N_WITH_COMMENTS_SINGLE_NODE;
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath));
     }
 
     /**
      * 3.7 Document Subsets
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-DocSubsets">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test37() throws Exception {
+    public void test37()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         String descri = "3.7 Document Subsets. (uncommented)";
         String fileIn = prefix + "in/37_input.xml";
         String fileRef = prefix + "in/37_c14n.xml";
         String fileOut = prefix + "out/xpath_37_output.xml";
         String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        boolean validating = true;
 
         Map<String, String> namespace = new HashMap<>();
         namespace.put("ietf", "http://www.ietf.org");
@@ -387,23 +581,40 @@
             + "]";
 
         assertTrue(descri,
-                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, xpath, namespace));
+                   c14nAndCompare(fileIn, fileRef, fileOut, c14nURI, validating, xpath, namespace));
     }
 
     /**
      * 3.7 Document Subsets
      *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
      * @see <A HREF="http://www.w3.org/TR/2001/PR-xml-c14n-20010119#Example-DocSubsets">the example from the spec</A>
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void test37byNodeList() throws Exception {
+    public void test37byNodeList()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
 
         //String descri = "3.7 Document Subsets. (uncommented), c14n by NodeList";
         String fileIn = prefix + "in/37_input.xml";
         String fileRef = prefix + "in/37_c14n.xml";
         //String c14nURI = Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+        //boolean validating = true;
 
-        Document doc = XMLUtils.read(new FileInputStream(fileIn), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+
+        db.setEntityResolver(resolver);
+
+        Document doc = db.parse(resolver.resolveEntity(null, fileIn));
 
         String xpath = "(//. | //@* | //namespace::*)"
             + "[ "
@@ -424,9 +635,10 @@
         NodeList nodes = (NodeList)xPath.evaluate(xpath, doc, XPathConstants.NODESET);
         Canonicalizer c14n =
             Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
-        byte[] c14nBytes = c14n.canonicalizeXPathNodeSet(nodes);
-        InputStream refStream = new FileInputStream(fileRef);
-        byte[] refBytes = JavaUtils.getBytesFromStream(refStream);
+        byte c14nBytes[] = c14n.canonicalizeXPathNodeSet(nodes);
+        InputStream refStream = resolver.resolveEntity(null,
+                                                       fileRef).getByteStream();
+        byte refBytes[] = JavaUtils.getBytesFromStream(refStream);
         assertEquals(new String(refBytes),new String(c14nBytes));
     }
 
@@ -439,9 +651,20 @@
      *
      * Implementations MUST report an operation failure on documents containing
      * relative namespace URIs.
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
      */
     @org.junit.Test
-    public void testRelativeNSbehaviour() throws Exception {
+    public void testRelativeNSbehaviour()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException {
 
         //J-
         String inputStr = ""
@@ -453,9 +676,10 @@
             + "";
         //J+
 
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(inputStr.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         boolean weCatchedTheRelativeNS = false;
 
@@ -482,17 +706,31 @@
      * within the UTF-16 data are not removed) [UTF-16, Section 3.2]. Support
      * for ISO-8859-1 encoding is RECOMMENDED, and all other character encodings
      * are OPTIONAL.
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
      */
     @org.junit.Test
-    public void testTranslationFromUTF16toUTF8() throws Exception {
+    public void testTranslationFromUTF16toUTF8()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException {
         String val =
             "<UTF16>The german &amp;auml (which is Unicode &amp;#xE4;):  &quot;&#xE4;&quot;</UTF16>";
-        byte[] utf16 = convertToUTF16(val.getBytes());
+        byte utf16[] = convertToUTF16(val.getBytes());
         Canonicalizer c14n =
             Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
-        byte[] c14nBytes = c14n.canonicalize(utf16);
-        InputStream refStream = new FileInputStream(prefix + "/in/testTranslationFromUTF16toUTF8.xml");
-        byte[] refBytes = JavaUtils.getBytesFromStream(refStream);
+        byte c14nBytes[] = c14n.canonicalize(utf16);
+        org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+        InputStream refStream =
+            resolver.resolveEntity(
+                null, prefix + "/in/testTranslationFromUTF16toUTF8.xml").getByteStream();
+        byte refBytes[] = JavaUtils.getBytesFromStream(refStream);
         boolean equal = java.security.MessageDigest.isEqual(refBytes, c14nBytes);
 
         assertTrue("Parser does not translate to UCS character domain", equal);
@@ -500,9 +738,21 @@
 
     /**
      * Method testXMLAttributes1
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void testXMLAttributes1() throws Exception {
+    public void testXMLAttributes1()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:lang='de'>"
@@ -525,9 +775,21 @@
 
     /**
      * Method testXMLAttributes2
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void testXMLAttributes2() throws Exception {
+    public void testXMLAttributes2()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:lang='uk'>"
@@ -550,9 +812,21 @@
 
     /**
      * Method testXMLAttributes3
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
-    public void testXMLAttributes3() throws Exception {
+    public void testXMLAttributes3()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:lang='de'>"
@@ -575,10 +849,22 @@
 
     /**
      * Method testXMLAttributes4
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
     @org.junit.Ignore
-    public void _testXMLAttributes4() throws Exception {
+    public void _testXMLAttributes4()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:lang='de'>"
@@ -603,10 +889,22 @@
 
     /**
      * Method testXMLAttributes5
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
     @org.junit.Ignore
-    public void _testXMLAttributes5() throws Exception {
+    public void _testXMLAttributes5()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:lang='de'>"
@@ -631,10 +929,22 @@
 
     /**
      * Method testXMLAttributes6
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
     @org.junit.Test
     @org.junit.Ignore
-    public void _testXMLAttributes6() throws Exception {
+    public void _testXMLAttributes6()
+        throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         //J-
         String input = ""
             + "<included xml:space='preserve'  xml:lang='de'>"
@@ -663,12 +973,28 @@
      * @param input
      * @param definedOutput
      * @param writeResultsToFile
+     *
+     * @throws CanonicalizationException
+     * @throws FileNotFoundException
+     * @throws IOException
+     * @throws InvalidCanonicalizerException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerException
+     * @throws XPathExpressionException
      */
-    private boolean doTestXMLAttributes(String input, String definedOutput) throws Exception {
+    private boolean doTestXMLAttributes(String input, String definedOutput)
+        throws IOException, FileNotFoundException, SAXException,
+    ParserConfigurationException, CanonicalizationException,
+    InvalidCanonicalizerException, TransformerException, XPathExpressionException {
+
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(true);
+
+        db.setErrorHandler(new IgnoreAllErrorHandler());
 
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(input.getBytes())) {
-            doc = XMLUtils.read(is, true);
+            doc = db.parse(is);
         }
         Canonicalizer c14nizer =
             Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
@@ -684,8 +1010,8 @@
         NodeList nodes =
             (NodeList)xPath.evaluate(xpath, doc, XPathConstants.NODESET);
 
-        byte[] result = c14nizer.canonicalizeXPathNodeSet(nodes);
-        byte[] defined = definedOutput.getBytes();
+        byte result[] = c14nizer.canonicalizeXPathNodeSet(nodes);
+        byte defined[] = definedOutput.getBytes();
         assertEquals(definedOutput, new String(result));
         return java.security.MessageDigest.isEqual(defined, result);
     }
@@ -695,11 +1021,14 @@
                                    String fileRef,
                                    String fileOut,
                                    String c14nURI,
+                                   boolean validating,
                                    String xpath
-                               ) throws Exception {
+                               ) throws IOException, FileNotFoundException, SAXException,
+                                   ParserConfigurationException, CanonicalizationException,
+                                   InvalidCanonicalizerException, TransformerException, XPathExpressionException {
         Map<String, String> namespace = new HashMap<>();
         return c14nAndCompare(fileIn, fileRef, fileOut,
-            c14nURI, xpath, namespace);
+            c14nURI, validating, xpath, namespace);
     }
 
     private boolean c14nAndCompare(
@@ -707,15 +1036,27 @@
         String fileRef,
         String fileOut,
         String c14nURI,
+        boolean validating,
         String xpath,
         Map<String, String> namespaces
-    ) throws Exception {
+    ) throws IOException, FileNotFoundException, SAXException,
+        ParserConfigurationException, CanonicalizationException,
+        InvalidCanonicalizerException, TransformerException, XPathExpressionException {
 
-        Document doc = XMLUtils.read(fileIn, false);
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(validating, false);
+
+        // throw away all warnings and errors
+        documentBuilder.setErrorHandler(new IgnoreAllErrorHandler());
+
+        // org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+        // documentBuilder.setEntityResolver(resolver);
+        // Document doc = documentBuilder.parse(resolver.resolveEntity(null, fileIn));
+
+        Document doc = documentBuilder.parse(fileIn);
 
 
         Canonicalizer c14n = Canonicalizer.getInstance(c14nURI);
-        byte[] c14nBytes = null;
+        byte c14nBytes[] = null;
 
         if (xpath == null) {
             c14nBytes = c14n.canonicalizeSubtree(doc);
@@ -734,8 +1075,8 @@
         }
 
         // org.xml.sax.InputSource refIs = resolver.resolveEntity(null, fileRef);
-        // byte[] refBytes = JavaUtils.getBytesFromStream(refIs.getByteStream());
-        byte[] refBytes = JavaUtils.getBytesFromFile(fileRef);
+        // byte refBytes[] = JavaUtils.getBytesFromStream(refIs.getByteStream());
+        byte refBytes[] = JavaUtils.getBytesFromFile(fileRef);
 
         // if everything is OK, result is true; we do a binary compare, byte by byte
         boolean result = java.security.MessageDigest.isEqual(refBytes, c14nBytes);
@@ -763,14 +1104,23 @@
      * UTF-16 encoded XML document which is serialized to byte[] and returned.
      *
      * @param input
+     *
+     * @throws IOException
+     * @throws ParserConfigurationException
+     * @throws SAXException
+     * @throws TransformerConfigurationException
+     * @throws TransformerException
      */
-    public static byte[] convertToUTF16(byte[] input) throws Exception {
+    public static byte[] convertToUTF16(byte input[])
+        throws ParserConfigurationException, IOException, SAXException,
+        TransformerConfigurationException, TransformerException {
         //String ENCODING_ISO8859_1 = "ISO-8859-1";
         //String ENCODING_UTF8 = java.nio.charset.StandardCharsets.UTF_8;
         String ENCODING_UTF16 = "UTF-16";
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(input)) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         TransformerFactory tFactory = TransformerFactory.newInstance();
         Transformer transformer = tFactory.newTransformer();
@@ -787,4 +1137,4 @@
         return os.toByteArray();
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/ExclusiveC14NInteropTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/ExclusiveC14NInteropTest.java
index 4d158e9..1559fce 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/ExclusiveC14NInteropTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/ExclusiveC14NInteropTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
-import java.io.FileInputStream;
 
 import org.apache.xml.security.signature.Reference;
 import org.apache.xml.security.signature.XMLSignature;
@@ -29,8 +29,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertNull;
-
 
 /**
  * Interop test for exclusive canonical XML.
@@ -62,7 +60,7 @@
 
         String success = t("src/test/resources/interop/c14n/Y1", "exc-signature.xml", true);
 
-        assertNull(success);
+        assertTrue(success, success == null);
     }
 
     /**
@@ -75,7 +73,7 @@
 
         String success = t("src/test/resources/interop/c14n/Y2", "signature-joseph-exc.xml", false);
 
-        assertNull(success);
+        assertTrue(success, success == null);
     }
 
     /**
@@ -88,7 +86,7 @@
 
         String success = t("src/test/resources/interop/c14n/Y3", "signature.xml", false);
 
-        assertNull(success);
+        assertTrue(success, success == null);
     }
 
     /**
@@ -101,7 +99,7 @@
 
         String success = t("src/test/resources/interop/c14n/Y4", "signature.xml", true);
 
-        assertNull(success);
+        assertTrue(success, success == null);
     }
 
     @org.junit.Test
@@ -109,7 +107,7 @@
 
         String success = t("src/test/resources/interop/xfilter2/merlin-xpath-filter2-three", "sign-spec.xml", true);
 
-        assertNull(success);
+        assertTrue(success, success == null);
     }
 
     private String t(String directory, String file, boolean secureValidation) throws Exception {
@@ -120,7 +118,8 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         Element sigElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
@@ -143,7 +142,7 @@
                 LOG.debug("Reference " + i + " was OK");
             } else {
                 sb.append(i);
-                sb.append(' ');
+                sb.append(" ");
 
                 //JavaUtils.writeBytesToFilename(directory + "/c14n-" + i + ".apache.txt", signature.getSignedInfo().item(i).getContentsAfterTransformation().getBytes());
                 //JavaUtils.writeBytesToFilename(directory + "/c14n-" + i + ".apache.html", signature.getSignedInfo().item(i).getHTMLRepresentation().getBytes());
@@ -165,4 +164,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/NameSpaceSymbTableTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/NameSpaceSymbTableTest.java
index d87728f..046cacf 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/NameSpaceSymbTableTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/NameSpaceSymbTableTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -27,22 +28,15 @@
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
 public class NameSpaceSymbTableTest {
     static Attr node1, node2;
     static {
         try {
-            Document doc = XMLUtils.newDocument();
+            Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
             node1 = doc.createAttributeNS("a","b");
             node2 = doc.createAttributeNS("b","c");
         } catch (Exception e) {
-            // e.printStackTrace();
+            e.printStackTrace();
         }
     }
 
@@ -208,4 +202,4 @@
         ns.addMappingAndRender("ctrl", "http://foo.com/controls", node1);
         ns.addMappingAndRender("wiki", "http://foo.com/samples/wiki", node1);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario191Test.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario191Test.java
index c19d9c1..8be923f 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario191Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario191Test.java
@@ -18,19 +18,20 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 import org.apache.xml.security.c14n.implementations.Canonicalizer11_OmitComments;
 import org.apache.xml.security.utils.XMLUtils;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * This is a test for Santuario-191:
  *
@@ -54,6 +55,8 @@
       + "    <user2>Bob</user2>"
       + "</data>";
 
+    private DocumentBuilder db;
+
     static {
         org.apache.xml.security.Init.init();
     }
@@ -63,9 +66,10 @@
         //
         // Parse the Data
         //
+        db = XMLUtils.createDocumentBuilder(false);
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(INPUT_DATA.getBytes(StandardCharsets.UTF_8))) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
 
         //
@@ -80,7 +84,7 @@
         //
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         out.write(result);
-        assertEquals(EXPECTED_RESULT, out.toString(StandardCharsets.UTF_8.name()));
+        assertTrue(EXPECTED_RESULT.equals(out.toString(StandardCharsets.UTF_8.name())));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario273Test.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario273Test.java
index 8c73484..8195f43 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario273Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/Santuario273Test.java
@@ -18,10 +18,12 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -33,8 +35,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * This is a test for Santuario-273:
  *
@@ -79,9 +79,12 @@
 
     @org.junit.Test
     public void testC14n11Base() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true);
+
+        documentBuilder.setErrorHandler(new org.apache.xml.security.utils.IgnoreAllErrorHandler());
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(input.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = documentBuilder.parse(is);
         }
 
         Canonicalizer c14n =
@@ -98,4 +101,4 @@
         assertEquals( new String(output, java.nio.charset.StandardCharsets.UTF_8), expectedResult);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/UtfHelperTest.java b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/UtfHelperTest.java
index 1b379e6..f0f6a6f 100644
--- a/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/UtfHelperTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/c14n/implementations/UtfHelperTest.java
@@ -18,22 +18,24 @@
  */
 package org.apache.xml.security.test.dom.c14n.implementations;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 
 import org.apache.xml.security.c14n.implementations.UtfHelpper;
 
-import static org.junit.Assert.assertArrayEquals;
-
 public class UtfHelperTest {
 
     @org.junit.Test
     public void testBug40156() {
         String s = "\u00e4\u00f6\u00fc";
-        byte[] a = UtfHelpper.getStringInUtf8(s);
-        byte[] correct = s.getBytes(StandardCharsets.UTF_8);
-        assertArrayEquals(correct, a);
+        byte a[] = UtfHelpper.getStringInUtf8(s);
+        byte correct[] = s.getBytes(StandardCharsets.UTF_8);
+        boolean equals = Arrays.equals(correct, a);
+        assertTrue(equals);
     }
 
     @org.junit.Test
@@ -54,7 +56,7 @@
         ByteArrayOutputStream charByCharOs = new ByteArrayOutputStream();
         ByteArrayOutputStream strOs = new ByteArrayOutputStream();
 
-        char[] chs = new char[chunk * 2];
+        char chs[] = new char[chunk * 2];
         int pos = 0;
         for (int i = 0; i < chunk; i++) {
             int ch = chunk * j + i;
@@ -66,7 +68,7 @@
                 pos += offset;
             }
         }
-        char[] newResult = new char[pos];
+        char newResult[] = new char[pos];
         System.arraycopy(chs, 0, newResult, 0, pos);
         for (int i = 0; i < pos; ) {
             int ch = Character.codePointAt(newResult, i);
@@ -75,20 +77,23 @@
         }
 
         String str = new String(newResult);
-        byte[] a = UtfHelpper.getStringInUtf8(str);
-
-        // System.out.println("chunk:"+j);
-        byte[] correct = str.getBytes(StandardCharsets.UTF_8);
-        assertArrayEquals("UtfHelper.getStringInUtf8 false", correct, a);
-        assertArrayEquals(
-                   "UtfHelper.getStringInUtf8 false",
-                   correct, charByCharOs.toByteArray()
-        );
-        UtfHelpper.writeStringToUtf8(str, strOs);
-        assertArrayEquals(
-                   "UtfHelper.writeStringToUtf8 false",
-                   correct, strOs.toByteArray()
-        );
+        byte a[] = UtfHelpper.getStringInUtf8(str);
+        try {
+            // System.out.println("chunk:"+j);
+            byte correct[] = str.getBytes(StandardCharsets.UTF_8);
+            assertTrue("UtfHelper.getStringInUtf8 false", Arrays.equals(correct, a));
+            assertTrue(
+                "UtfHelper.getStringInUtf8 false",
+                Arrays.equals(correct, charByCharOs.toByteArray())
+            );
+            UtfHelpper.writeStringToUtf8(str, strOs);
+            assertTrue(
+                "UtfHelper.writeStringToUtf8 false",
+                Arrays.equals(correct, strOs.toByteArray())
+            );
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/BaltimoreEncTest.java b/src/test/java/org/apache/xml/security/test/dom/encryption/BaltimoreEncTest.java
index b848726..0bff4f6 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/BaltimoreEncTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/BaltimoreEncTest.java
@@ -33,6 +33,7 @@
 import javax.crypto.NoSuchPaddingException;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -55,9 +56,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
+import static org.junit.Assert.*;
 
 /**
  * Interop test for XML Encryption
@@ -92,7 +91,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         cardNumber = retrieveCCNumber(doc);
 
@@ -392,7 +392,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         // Now we have the document, lets build the XMLCipher element
         Element ee = null;
@@ -431,7 +432,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         // Now we have the document, lets build the XMLCipher element
         Element ee = null;
@@ -599,7 +601,7 @@
 
         String cc = retrieveCCNumber(d);
         LOG.debug("Retrieved Credit Card : " + cc);
-        assertEquals(cardNumber, cc);
+        assertTrue(cc, cc!= null && cc.equals(cardNumber));
 
         // Test cc numbers
         if (doNodeCheck) {
@@ -618,4 +620,4 @@
         String input = new String(data, StandardCharsets.US_ASCII);
         assertEquals(testDecryptString, input);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/BobKeyResolver.java b/src/test/java/org/apache/xml/security/test/dom/encryption/BobKeyResolver.java
index 74b8a17..d867a95 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/BobKeyResolver.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/BobKeyResolver.java
@@ -62,7 +62,7 @@
         try {
             if (isKeyName) {
                 _kn = new KeyName(element, "");
-                if ("bob".equals(_kn.getKeyName())) {
+                if (_kn.getKeyName().equals("bob")) {
                     return true;
                 }
             }
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/EncryptContentTest.java b/src/test/java/org/apache/xml/security/test/dom/encryption/EncryptContentTest.java
index 311bfb8..170ea49 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/EncryptContentTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/EncryptContentTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.encryption;
 
+import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -29,6 +30,7 @@
 import javax.crypto.SecretKey;
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.DESedeKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.transform.TransformerFactory;
 
 import org.apache.xml.security.algorithms.JCEMapper;
@@ -42,8 +44,6 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-
 public class EncryptContentTest {
 
     static org.slf4j.Logger LOG =
@@ -71,11 +71,13 @@
         "  </user>\n" +
         "</users>\n";
 
+    private DocumentBuilder db;
     private SecretKey secretKey;
     private boolean haveISOPadding;
 
     public EncryptContentTest() throws Exception {
         org.apache.xml.security.Init.init();
+        db = XMLUtils.createDocumentBuilder(false);
 
         byte[] bits192 = "abcdefghijklmnopqrstuvwx".getBytes();
         DESedeKeySpec keySpec = new DESedeKeySpec(bits192);
@@ -116,7 +118,7 @@
 
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(DATA.getBytes(StandardCharsets.UTF_8))) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         NodeList dataToEncrypt = doc.getElementsByTagName("user");
 
@@ -136,7 +138,7 @@
 
         // child should be EncryptedData, if not throw exception
         Element childElem = (Element) child;
-        if (!"EncryptedData".equals(childElem.getLocalName())) {
+        if (!childElem.getLocalName().equals("EncryptedData")) {
             // t.transform(new DOMSource(doc), new StreamResult(System.out));
             throw new Exception("Element content not replaced");
         }
@@ -168,7 +170,7 @@
 
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(MULTIPLE_USER_DATA.getBytes(StandardCharsets.UTF_8))) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         NodeList dataToEncrypt = doc.getElementsByTagName("user");
 
@@ -189,4 +191,4 @@
         assertEquals(keyInfoList.getLength(), 2);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/ReferenceListTest.java b/src/test/java/org/apache/xml/security/test/dom/encryption/ReferenceListTest.java
index b2b88eb..9ceca17 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/ReferenceListTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/ReferenceListTest.java
@@ -18,9 +18,12 @@
  */
 package org.apache.xml.security.test.dom.encryption;
 
+import static org.junit.Assert.*;
 
 import java.util.Iterator;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.encryption.Reference;
 import org.apache.xml.security.encryption.ReferenceList;
 import org.apache.xml.security.encryption.XMLCipher;
@@ -29,24 +32,21 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
-
 public class ReferenceListTest {
 
     static org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(ReferenceListTest.class);
 
+    private DocumentBuilder db;
 
     public ReferenceListTest() throws Exception {
         org.apache.xml.security.Init.init();
+        db = XMLUtils.createDocumentBuilder(false);
     }
 
     @org.junit.Test
     public void testReferenceList() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
 
         XMLCipher dataCipher = XMLCipher.getInstance();
         dataCipher.init(XMLCipher.DECRYPT_MODE, null);
@@ -104,7 +104,7 @@
         ref = iter.next();
         assertEquals(EncryptionConstants._TAG_DATAREFERENCE, ref.getType());
         assertEquals("#id2", ref.getURI());
-        assertFalse(iter.hasNext());
+        assertTrue(!iter.hasNext());
 
         iter = keyRefList.getReferences();
         ref = iter.next();
@@ -113,6 +113,6 @@
         ref = iter.next();
         assertEquals(EncryptionConstants._TAG_KEYREFERENCE, ref.getType());
         assertEquals("#id20", ref.getURI());
-        assertFalse(iter.hasNext());
+        assertTrue(!iter.hasNext());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/SignedEncryptedTest.java b/src/test/java/org/apache/xml/security/test/dom/encryption/SignedEncryptedTest.java
index a018830..079402f 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/SignedEncryptedTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/SignedEncryptedTest.java
@@ -26,6 +26,7 @@
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
@@ -33,6 +34,7 @@
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
@@ -47,11 +49,9 @@
 import java.security.PublicKey;
 import java.util.UUID;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  */
-public class SignedEncryptedTest {
+public class SignedEncryptedTest extends Assert {
 
     private static final String SAMPLE_MSG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
             + "<SOAP-ENV:Envelope "
@@ -100,9 +100,10 @@
     }
 
     public void secureAndVerify(TransformerFactory transformerFactory, boolean useDocumentSerializer) throws Exception {
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(SAMPLE_MSG.getBytes(StandardCharsets.UTF_8))) {
-            document = XMLUtils.read(is, false);
+            document = builder.parse(is);
         }
 
         // Set up the Key
@@ -156,6 +157,6 @@
         deCipher.doFinal(document, element, true);
 
         XMLSignature xmlSignatureVerifier = new XMLSignature(sigElement, "");
-        assertTrue(xmlSignatureVerifier.checkSignatureValue(pub));
+        Assert.assertTrue(xmlSignatureVerifier.checkSignatureValue(pub));
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/XMLCipherTest.java b/src/test/java/org/apache/xml/security/test/dom/encryption/XMLCipherTest.java
index 3f11545..8eb1537 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/XMLCipherTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/XMLCipherTest.java
@@ -18,13 +18,11 @@
  */
 package org.apache.xml.security.test.dom.encryption;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.security.Key;
@@ -41,7 +39,7 @@
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.DESedeKeySpec;
 import javax.crypto.spec.SecretKeySpec;
-import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.algorithms.JCEMapper;
 import org.apache.xml.security.c14n.Canonicalizer;
@@ -61,12 +59,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
 
 /**
  *
@@ -633,7 +625,9 @@
     public void testSameDocumentCipherReference() throws Exception {
 
         if (haveISOPadding) {
-            Document d = XMLUtils.newDocument();
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+
+            Document d = db.newDocument();
 
             Element docElement = d.createElement("EncryptedDoc");
             d.appendChild(docElement);
@@ -704,6 +698,8 @@
     public void testPhysicalRepresentation() throws Exception {
 
         if (haveISOPadding) {
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+
             byte[] bits192 = "abcdefghijklmnopqrstuvwx".getBytes();
             DESedeKeySpec keySpec = new DESedeKeySpec(bits192);
             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
@@ -714,7 +710,7 @@
             final String DATA1 = "<ns:root xmlns:ns=\"ns.com\"><ns:elem xmlns:ns2=\"ns2.com\">11</ns:elem></ns:root>";
             Document doc = null;
             try (InputStream is = new ByteArrayInputStream(DATA1.getBytes(StandardCharsets.UTF_8))) {
-                doc = XMLUtils.read(is, false);
+                doc = db.parse(is);
             }
             Element elem = (Element)doc.getDocumentElement().getFirstChild();
 
@@ -740,7 +736,7 @@
             // Test default namespace undeclaration is preserved
             final String DATA2 = "<ns:root xmlns=\"defns.com\" xmlns:ns=\"ns.com\"><elem xmlns=\"\">11</elem></ns:root>";
             try (InputStream is = new ByteArrayInputStream(DATA2.getBytes(StandardCharsets.UTF_8))) {
-                doc = XMLUtils.read(is, false);
+                doc = db.parse(is);
             }
             elem = (Element)doc.getDocumentElement().getFirstChild();
 
@@ -767,9 +763,9 @@
             // Other c14n algorithms add a newline after comments and PIs, when they are before or after the document element.
             final String DATA3 = "<root><!--comment1--><?pi1 target1?><elem/><!--comment2--><?pi2 target2?></root>";
             try (InputStream is = new ByteArrayInputStream(DATA3.getBytes(StandardCharsets.UTF_8))) {
-                doc = XMLUtils.read(is, false);
+                doc = db.parse(is);
             }
-            elem = doc.getDocumentElement();
+            elem = (Element)doc.getDocumentElement();
 
             dataCipher = XMLCipher.getInstance(XMLCipher.TRIPLEDES);
             dataCipher.init(XMLCipher.ENCRYPT_MODE, secretKey);
@@ -864,7 +860,8 @@
         }
         File f = new File(filename);
 
-        Document document = XMLUtils.read(new FileInputStream(f), false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(f);
 
         XMLCipher keyCipher = XMLCipher.getInstance();
         keyCipher.init(XMLCipher.UNWRAP_MODE, null);
@@ -984,9 +981,18 @@
         return baos.toString(StandardCharsets.UTF_8.name());
     }
 
-    private Document document() throws FileNotFoundException, ParserConfigurationException, SAXException, IOException {
-        File f = new File(documentName);
-        return XMLUtils.read(new FileInputStream(f), false);
+    private Document document() {
+        Document d = null;
+        try {
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            File f = new File(documentName);
+            d = db.parse(f);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(-1);
+        }
+
+        return d;
     }
 
     private String element() {
@@ -994,7 +1000,16 @@
     }
 
     private int index() {
-        return Integer.parseInt(elementIndex);
+        int result = -1;
+
+        try {
+            result = Integer.parseInt(elementIndex);
+        } catch (NumberFormatException nfe) {
+            nfe.printStackTrace();
+            System.exit(-1);
+        }
+
+        return result;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/encryption/XMLEncryption11Test.java b/src/test/java/org/apache/xml/security/test/dom/encryption/XMLEncryption11Test.java
index c8d5629..ad16b04 100644
--- a/src/test/java/org/apache/xml/security/test/dom/encryption/XMLEncryption11Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/encryption/XMLEncryption11Test.java
@@ -32,6 +32,7 @@
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
 import javax.crypto.NoSuchPaddingException;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -52,10 +53,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * This is a set of tests that use the test vectors associated with the W3C XML Encryption 1.1 specification:
  *
@@ -88,7 +87,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         cardNumber = retrieveCCNumber(doc);
 
@@ -183,7 +183,8 @@
             }
             File f = new File(filename);
 
-            Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc = db.parse(new java.io.FileInputStream(f));
 
             Key sessionKey = getSessionKey("http://www.w3.org/2009/xmlenc11#aes128-gcm");
             EncryptedKey encryptedKey =
@@ -247,7 +248,8 @@
             }
             File f = new File(filename);
 
-            Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc = db.parse(new java.io.FileInputStream(f));
 
             Key sessionKey = getSessionKey("http://www.w3.org/2009/xmlenc11#aes128-gcm");
             EncryptedKey encryptedKey =
@@ -349,7 +351,8 @@
             }
             File f = new File(filename);
 
-            Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc = db.parse(new java.io.FileInputStream(f));
 
             Key sessionKey = getSessionKey("http://www.w3.org/2009/xmlenc11#aes192-gcm");
             EncryptedKey encryptedKey =
@@ -450,7 +453,8 @@
             }
             File f = new File(filename);
 
-            Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc = db.parse(new java.io.FileInputStream(f));
 
             Key sessionKey = getSessionKey("http://www.w3.org/2009/xmlenc11#aes256-gcm");
             EncryptedKey encryptedKey =
@@ -551,7 +555,8 @@
             }
             File f = new File(filename);
 
-            Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+            DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+            Document doc = db.parse(new java.io.FileInputStream(f));
 
             Key sessionKey = getSessionKey("http://www.w3.org/2009/xmlenc11#aes256-gcm");
             EncryptedKey encryptedKey =
@@ -603,7 +608,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         return decryptElement(doc, rsaKey, rsaCert);
     }
@@ -635,7 +641,7 @@
         X509Data certData = kiek.itemX509Data(0);
         XMLX509Certificate xcert = certData.itemCertificate(0);
         X509Certificate cert = xcert.getX509Certificate();
-        assertEquals(rsaCert, cert);
+        assertTrue(rsaCert.equals(cert));
 
         XMLCipher cipher2 = XMLCipher.getInstance();
         cipher2.init(XMLCipher.UNWRAP_MODE, rsaKey);
@@ -801,7 +807,7 @@
 
         String cc = retrieveCCNumber(d);
         LOG.debug("Retrieved Credit Card : " + cc);
-        assertEquals(cardNumber, cc);
+        assertTrue(cc, cc!= null && cc.equals(cardNumber));
 
         // Test cc numbers
         if (doNodeCheck) {
@@ -813,4 +819,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/interop/BaltimoreTest.java b/src/test/java/org/apache/xml/security/test/dom/interop/BaltimoreTest.java
index 3c99c9f..7db5e3d 100644
--- a/src/test/java/org/apache/xml/security/test/dom/interop/BaltimoreTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/interop/BaltimoreTest.java
@@ -21,16 +21,12 @@
 import org.apache.xml.security.test.dom.utils.resolver.OfflineResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 
+import static org.junit.Assert.*;
 
 import java.nio.charset.StandardCharsets;
 
 import org.apache.xml.security.signature.XMLSignatureException;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This test is to ensure interoperability with the examples provided by Merlin Huges
  * from Baltimore using KeyTools XML. These test vectors are located in the directory
@@ -107,7 +103,7 @@
             LOG.error("Verification crashed for " + filename);
             throw ex;
         } catch (XMLSignatureException ex) {
-            if (!"algorithms.HMACOutputLengthMin".equals(ex.getMsgID())) {
+            if (!ex.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(ex.getMessage());
             }
         }
@@ -373,7 +369,7 @@
             LOG.error("Verification crashed for " + filename);
             throw ex;
         } catch (XMLSignatureException ex) {
-            if (!"algorithms.HMACOutputLengthMin".equals(ex.getMsgID())) {
+            if (!ex.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(ex.getMessage());
             }
         }
@@ -569,4 +565,4 @@
         assertTrue(filename, verify);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/interop/IAIKTest.java b/src/test/java/org/apache/xml/security/test/dom/interop/IAIKTest.java
index 3844cb9..4b31bf5 100644
--- a/src/test/java/org/apache/xml/security/test/dom/interop/IAIKTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/interop/IAIKTest.java
@@ -20,6 +20,7 @@
 
 import org.apache.xml.security.test.dom.utils.resolver.OfflineResolver;
 
+import static org.junit.Assert.*;
 
 import java.nio.charset.StandardCharsets;
 
@@ -27,10 +28,6 @@
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 import org.apache.xml.security.utils.resolver.implementations.ResolverAnonymous;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This test is to ensure interoperability with the examples provided by the IAIK
  * XML Signature implementation. Thanks to Gregor Karlinger who provided these
@@ -83,7 +80,7 @@
             LOG.error("Verification crashed for " + filename);
             throw ex;
         } catch (XMLSignatureException ex) {
-            if (!"algorithms.HMACOutputLengthMin".equals(ex.getMsgID())) {
+            if (!ex.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(ex.getMessage());
             }
         }
@@ -411,4 +408,4 @@
         assertTrue(filename, verify);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/interop/IBMTest.java b/src/test/java/org/apache/xml/security/test/dom/interop/IBMTest.java
index 5ac8e07..2f57aaf 100644
--- a/src/test/java/org/apache/xml/security/test/dom/interop/IBMTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/interop/IBMTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.interop;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 
@@ -25,9 +26,6 @@
 import org.apache.xml.security.utils.JavaUtils;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 
 /**
  * This test is to ensure interoperability with the examples provided by the IBM
@@ -310,7 +308,7 @@
             LOG.error("Verification failed for " + filename + ", had to be broken but was successful");
         }
 
-        assertFalse(filename, verify);
+        assertTrue(filename, !verify);
     }
 
     /**
diff --git a/src/test/java/org/apache/xml/security/test/dom/interop/InteropTestBase.java b/src/test/java/org/apache/xml/security/test/dom/interop/InteropTestBase.java
index e483347..a2e6541 100644
--- a/src/test/java/org/apache/xml/security/test/dom/interop/InteropTestBase.java
+++ b/src/test/java/org/apache/xml/security/test/dom/interop/InteropTestBase.java
@@ -19,7 +19,6 @@
 package org.apache.xml.security.test.dom.interop;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 import java.util.Iterator;
@@ -41,9 +40,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
+import static org.junit.Assert.*;
 
 public class InteropTestBase {
 
@@ -63,7 +60,8 @@
         String filename, ResourceResolverSpi resolver, boolean followManifests, byte[] hmacKey
     ) throws Exception {
         File f = new File(filename);
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(new java.io.FileInputStream(f));
 
         XPathFactory xpf = XPathFactory.newInstance();
         XPath xpath = xpf.newXPath();
@@ -79,7 +77,7 @@
         }
         signature.setFollowNestedManifests(followManifests);
 
-        byte[] keybytes = hmacKey;
+        byte keybytes[] = hmacKey;
         javax.crypto.SecretKey sk = signature.createSecretKey(keybytes);
 
         return signature.checkSignatureValue(sk);
@@ -94,7 +92,8 @@
                           boolean followManifests, boolean secureValidation)
         throws Exception {
         File f = new File(filename);
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         XPathFactory xpf = XPathFactory.newInstance();
         XPath xpath = xpf.newXPath();
@@ -178,4 +177,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/interop/RSASecurityTest.java b/src/test/java/org/apache/xml/security/test/dom/interop/RSASecurityTest.java
index baf175a..e96cd17 100644
--- a/src/test/java/org/apache/xml/security/test/dom/interop/RSASecurityTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/interop/RSASecurityTest.java
@@ -19,11 +19,10 @@
 package org.apache.xml.security.test.dom.interop;
 
 
+import static org.junit.Assert.assertTrue;
 
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 
-import static org.junit.Assert.assertTrue;
-
 
 /**
  * This test is to ensure interoperability with the examples provided by Blake Dournaee
@@ -86,4 +85,4 @@
         assertTrue(filename, verify);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/DEREncodedKeyValueTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/DEREncodedKeyValueTest.java
index caa0c52..460e33b 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/DEREncodedKeyValueTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/DEREncodedKeyValueTest.java
@@ -23,32 +23,33 @@
 import java.security.PublicKey;
 import java.security.spec.X509EncodedKeySpec;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.keys.content.DEREncodedKeyValue;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.JavaUtils;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
-public class DEREncodedKeyValueTest {
+public class DEREncodedKeyValueTest extends Assert {
 
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
-    private static final String ID_CONTROL = "abc123";
+    private DocumentBuilder documentBuilder;
 
     private PublicKey rsaKeyControl;
     private PublicKey dsaKeyControl;
     private PublicKey ecKeyControl;
 
+    private final String idControl = "abc123";
+
     public DEREncodedKeyValueTest() throws Exception {
+        documentBuilder = XMLUtils.createDocumentBuilder(false);
+
         rsaKeyControl = loadPublicKey("rsa.key", "RSA");
         dsaKeyControl = loadPublicKey("dsa.key", "DSA");
         ecKeyControl = loadPublicKey("ec.key", "EC");
@@ -56,7 +57,7 @@
 
     @org.junit.Test
     public void testSchema() throws Exception {
-        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(XMLUtils.newDocument(), rsaKeyControl);
+        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(documentBuilder.newDocument(), rsaKeyControl);
         Element element = derEncodedKeyValue.getElement();
 
         assertEquals("http://www.w3.org/2009/xmldsig11#", element.getNamespaceURI());
@@ -72,7 +73,7 @@
         DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(element, "");
         assertEquals(rsaKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(rsaKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
-        assertEquals(ID_CONTROL, derEncodedKeyValue.getId());
+        assertEquals(idControl, derEncodedKeyValue.getId());
     }
 
     @org.junit.Test
@@ -84,7 +85,7 @@
         DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(element, "");
         assertEquals(dsaKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(dsaKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
-        assertEquals(ID_CONTROL, derEncodedKeyValue.getId());
+        assertEquals(idControl, derEncodedKeyValue.getId());
     }
 
     @org.junit.Test
@@ -96,38 +97,38 @@
         DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(element, "");
         assertEquals(ecKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(ecKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
-        assertEquals(ID_CONTROL, derEncodedKeyValue.getId());
+        assertEquals(idControl, derEncodedKeyValue.getId());
     }
 
     @org.junit.Test
     public void testRSAPublicKeyFromKey() throws Exception {
-        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(XMLUtils.newDocument(), rsaKeyControl);
+        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(documentBuilder.newDocument(), rsaKeyControl);
         assertEquals(rsaKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(rsaKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
     }
 
     @org.junit.Test
     public void testDSAPublicKeyFromKey() throws Exception {
-        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(XMLUtils.newDocument(), dsaKeyControl);
+        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(documentBuilder.newDocument(), dsaKeyControl);
         assertEquals(dsaKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(dsaKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
     }
 
     @org.junit.Test
     public void testECPublicKeyFromKey() throws Exception {
-        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(XMLUtils.newDocument(), ecKeyControl);
+        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(documentBuilder.newDocument(), ecKeyControl);
         assertEquals(ecKeyControl, derEncodedKeyValue.getPublicKey());
         assertArrayEquals(ecKeyControl.getEncoded(), derEncodedKeyValue.getBytesFromTextChild());
     }
 
     @org.junit.Test
     public void testId() throws Exception {
-        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(XMLUtils.newDocument(), rsaKeyControl);
+        DEREncodedKeyValue derEncodedKeyValue = new DEREncodedKeyValue(documentBuilder.newDocument(), rsaKeyControl);
         assertEquals("", derEncodedKeyValue.getId());
         assertNull(derEncodedKeyValue.getElement().getAttributeNodeNS(null, Constants._ATT_ID));
 
-        derEncodedKeyValue.setId(ID_CONTROL);
-        assertEquals(ID_CONTROL, derEncodedKeyValue.getId());
+        derEncodedKeyValue.setId(idControl);
+        assertEquals(idControl, derEncodedKeyValue.getId());
         assertTrue(derEncodedKeyValue.getElement().getAttributeNodeNS(null, Constants._ATT_ID).isId());
 
         derEncodedKeyValue.setId(null);
@@ -145,7 +146,7 @@
     }
 
     private Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
     private PublicKey loadPublicKey(String filePath, String algorithm) throws Exception {
@@ -156,4 +157,4 @@
         return kf.generatePublic(keySpec);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/KeyInfoReferenceTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/KeyInfoReferenceTest.java
index e4282b5..7c6f489 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/KeyInfoReferenceTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/KeyInfoReferenceTest.java
@@ -20,29 +20,33 @@
 
 import java.io.FileInputStream;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.keys.content.KeyInfoReference;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
-public class KeyInfoReferenceTest {
+public class KeyInfoReferenceTest extends Assert {
 
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
-    private static final String ID_CONTROL = "abc123";
-    private static final String URI_CONTROL = "http://www.example.org/keyinfo.xml";
+    private DocumentBuilder documentBuilder;
+
+    private final String idControl = "abc123";
+    private final String uriControl = "http://www.example.org/keyinfo.xml";
+
+    public KeyInfoReferenceTest() throws Exception {
+        documentBuilder = XMLUtils.createDocumentBuilder(false);
+    }
 
     @org.junit.Test
     public void testSchema() throws Exception {
-        KeyInfoReference keyInfoReference = new KeyInfoReference(XMLUtils.newDocument(), URI_CONTROL);
+        KeyInfoReference keyInfoReference = new KeyInfoReference(documentBuilder.newDocument(), uriControl);
         Element element = keyInfoReference.getElement();
 
         assertEquals("http://www.w3.org/2009/xmldsig11#", element.getNamespaceURI());
@@ -56,24 +60,24 @@
         Element element = (Element) nl.item(0);
 
         KeyInfoReference keyInfoReference = new KeyInfoReference(element, "");
-        assertEquals(URI_CONTROL, keyInfoReference.getURI());
-        assertEquals(ID_CONTROL, keyInfoReference.getId());
+        assertEquals(uriControl, keyInfoReference.getURI());
+        assertEquals(idControl, keyInfoReference.getId());
     }
 
     @org.junit.Test
     public void testURIOnConstruction() throws Exception {
-        KeyInfoReference keyInfoReference = new KeyInfoReference(XMLUtils.newDocument(), URI_CONTROL);
-        assertEquals(URI_CONTROL, keyInfoReference.getURI());
+        KeyInfoReference keyInfoReference = new KeyInfoReference(documentBuilder.newDocument(), uriControl);
+        assertEquals(uriControl, keyInfoReference.getURI());
     }
 
     @org.junit.Test
     public void testId() throws Exception {
-        KeyInfoReference keyInfoReference = new KeyInfoReference(XMLUtils.newDocument(), URI_CONTROL);
+        KeyInfoReference keyInfoReference = new KeyInfoReference(documentBuilder.newDocument(), uriControl);
         assertEquals("", keyInfoReference.getId());
         assertNull(keyInfoReference.getElement().getAttributeNodeNS(null, Constants._ATT_ID));
 
-        keyInfoReference.setId(ID_CONTROL);
-        assertEquals(ID_CONTROL, keyInfoReference.getId());
+        keyInfoReference.setId(idControl);
+        assertEquals(idControl, keyInfoReference.getId());
         assertTrue(keyInfoReference.getElement().getAttributeNodeNS(null, Constants._ATT_ID).isId());
 
         keyInfoReference.setId(null);
@@ -91,7 +95,7 @@
     }
 
     private Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509CertificateTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509CertificateTest.java
index cc321e5..e990354 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509CertificateTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509CertificateTest.java
@@ -45,7 +45,7 @@
             SEP + "signature-x509-crt.xml");
 
         FileInputStream fis = new FileInputStream(f);
-        Document doc = XMLUtils.read(fis, false);
+        Document doc = XMLUtils.createDocumentBuilder(false).parse(fis);
         NodeList nl = doc.getElementsByTagNameNS
                 (Constants.SignatureSpecNS, "X509Certificate");
         XMLX509Certificate xmlCert =
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509DigestTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509DigestTest.java
index 7b14e4e..abf859a 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509DigestTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509DigestTest.java
@@ -22,33 +22,37 @@
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.content.x509.XMLX509Digest;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-
-public class XMLX509DigestTest {
+public class XMLX509DigestTest extends Assert {
 
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
-    private static final String ALG_URI_CONTROL = "http://www.w3.org/2001/04/xmlenc#sha256";
-    private static final String DIGEST_B64_CONTROL = "jToLQ/K7aaLHy/aXLFnjEfCwSQd9z0MrBOH6Ru/aJyY=";
+    private DocumentBuilder documentBuilder;
 
     private X509Certificate certControl;
+
+    private final String algorithmURIControl = "http://www.w3.org/2001/04/xmlenc#sha256";
+
+    private final String digestBase64Control = "jToLQ/K7aaLHy/aXLFnjEfCwSQd9z0MrBOH6Ru/aJyY=";
     private final byte[] digestControl;
 
     public XMLX509DigestTest() throws Exception {
+        documentBuilder = XMLUtils.createDocumentBuilder(false);
+
         certControl = loadCertificate("cert-X509Digest.crt");
 
-        digestControl = XMLUtils.decode(DIGEST_B64_CONTROL);
+        digestControl = XMLUtils.decode(digestBase64Control);
 
         if (!Init.isInitialized()) {
             Init.init();
@@ -57,7 +61,7 @@
 
     @org.junit.Test
     public void testSchema() throws Exception {
-        XMLX509Digest x509Digest = new XMLX509Digest(XMLUtils.newDocument(), digestControl, ALG_URI_CONTROL);
+        XMLX509Digest x509Digest = new XMLX509Digest(documentBuilder.newDocument(), digestControl, algorithmURIControl);
         Element element = x509Digest.getElement();
 
         assertEquals("http://www.w3.org/2009/xmldsig11#", element.getNamespaceURI());
@@ -71,27 +75,27 @@
         Element element = (Element) nl.item(0);
 
         XMLX509Digest x509Digest = new XMLX509Digest(element, "");
-        assertEquals(ALG_URI_CONTROL, x509Digest.getAlgorithm());
+        assertEquals(algorithmURIControl, x509Digest.getAlgorithm());
         assertArrayEquals(digestControl, x509Digest.getDigestBytes());
     }
 
     @org.junit.Test
     public void testDigestOnConstructionWithCert() throws Exception {
-        XMLX509Digest x509Digest = new XMLX509Digest(XMLUtils.newDocument(), certControl, ALG_URI_CONTROL);
-        assertEquals(ALG_URI_CONTROL, x509Digest.getAlgorithm());
+        XMLX509Digest x509Digest = new XMLX509Digest(documentBuilder.newDocument(), certControl, algorithmURIControl);
+        assertEquals(algorithmURIControl, x509Digest.getAlgorithm());
         assertArrayEquals(digestControl, x509Digest.getDigestBytes());
     }
 
     @org.junit.Test
     public void testDigestOnConstructionWithBytes() throws Exception {
-        XMLX509Digest x509Digest = new XMLX509Digest(XMLUtils.newDocument(), digestControl, ALG_URI_CONTROL);
-        assertEquals(ALG_URI_CONTROL, x509Digest.getAlgorithm());
+        XMLX509Digest x509Digest = new XMLX509Digest(documentBuilder.newDocument(), digestControl, algorithmURIControl);
+        assertEquals(algorithmURIControl, x509Digest.getAlgorithm());
         assertArrayEquals(digestControl, x509Digest.getDigestBytes());
     }
 
     @org.junit.Test
     public void testGetDigestBytesFromCert() throws Exception {
-        assertArrayEquals(digestControl, XMLX509Digest.getDigestBytesFromCert(certControl, ALG_URI_CONTROL));
+        assertArrayEquals(digestControl, XMLX509Digest.getDigestBytesFromCert(certControl, algorithmURIControl));
     }
 
 
@@ -105,7 +109,7 @@
     }
 
     private Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
     private X509Certificate loadCertificate(String fileName) throws Exception {
@@ -114,4 +118,4 @@
         return (X509Certificate) certFactory.generateCertificate(fis);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509IssuerSerialTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509IssuerSerialTest.java
index 1dde17a..619e641 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509IssuerSerialTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509IssuerSerialTest.java
@@ -18,13 +18,12 @@
  */
 package org.apache.xml.security.test.dom.keys.content.x509;
 
+import static org.junit.Assert.assertEquals;
 
 import org.apache.xml.security.keys.content.x509.XMLX509IssuerSerial;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * XMLX509IssuerSerial tests.
  *
@@ -34,7 +33,7 @@
     private Document doc;
 
     public XMLX509IssuerSerialTest() throws Exception {
-        doc = XMLUtils.newDocument();
+        doc = XMLUtils.createDocumentBuilder(false).newDocument();
     }
 
     @org.junit.Test
@@ -50,4 +49,4 @@
         assertEquals("CN=\\#abc123", is.getIssuerName());
         // System.out.println(is.getIssuerName());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509SKITest.java b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509SKITest.java
index 4a753e1..f534c71 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509SKITest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/content/x509/XMLX509SKITest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.keys.content.x509;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -31,8 +32,6 @@
 
 import org.apache.xml.security.keys.content.x509.XMLX509SKI;
 
-import static org.junit.Assert.assertFalse;
-
 /**
  * Test bugfix 41892: XML Security 1.4.0 does not build with IBM's JDK
  */
@@ -78,6 +77,6 @@
             new CollectionCertStoreParameters(Collections.singleton(cert)));
 
         Collection<?> certs = cs.getCertificates(xcs);
-        assertFalse(certs.isEmpty());
+        assertTrue(!certs.isEmpty());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/DEREncodedKeyValueResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/DEREncodedKeyValueResolverTest.java
index 19b1458..060163b 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/DEREncodedKeyValueResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/DEREncodedKeyValueResolverTest.java
@@ -25,12 +25,12 @@
 
 import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.KeyInfo;
+import org.junit.Assert;
 
 import static org.apache.xml.security.test.stax.utils.KeyLoader.loadPublicKey;
 import static org.apache.xml.security.test.stax.utils.KeyLoader.loadXML;
-import static org.junit.Assert.assertEquals;
 
-public class DEREncodedKeyValueResolverTest {
+public class DEREncodedKeyValueResolverTest extends Assert {
 
     private PublicKey rsaKeyControl;
     private PublicKey dsaKeyControl;
@@ -73,4 +73,4 @@
         KeyInfo keyInfo = new KeyInfo(element, "");
         assertEquals(ecKeyControl, keyInfo.getPublicKey());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyInfoReferenceResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyInfoReferenceResolverTest.java
index fad83c7..c58c794 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyInfoReferenceResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyInfoReferenceResolverTest.java
@@ -25,26 +25,28 @@
 import java.security.cert.X509Certificate;
 import java.security.spec.X509EncodedKeySpec;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.JavaUtils;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-
-public class KeyInfoReferenceResolverTest {
+public class KeyInfoReferenceResolverTest extends Assert {
 
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
+    private DocumentBuilder documentBuilder;
+
     public KeyInfoReferenceResolverTest() throws Exception {
+        documentBuilder = XMLUtils.createDocumentBuilder(false);
+
         if (!Init.isInitialized()) {
             Init.init();
         }
@@ -135,7 +137,7 @@
     }
 
     private Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
     private PublicKey loadPublicKey(String filePath, String algorithm) throws Exception {
@@ -160,4 +162,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyResolverTest.java
index f1cf884..4fb6c5f 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/KeyResolverTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.keys.keyresolver;
 
+import static org.junit.Assert.*;
 
 import java.io.FileInputStream;
 import java.math.BigInteger;
@@ -36,6 +37,7 @@
 import javax.crypto.NoSuchPaddingException;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 
 import org.apache.xml.security.algorithms.JCEMapper;
 import org.apache.xml.security.encryption.EncryptedData;
@@ -61,10 +63,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-
 /**
  * KeyResolver test.
  */
@@ -109,7 +107,8 @@
         KeyResolverSpi privateKeyResolver = new PrivateKeyResolver(ks, pwd);
         KeyResolverSpi secretKeyResolver = new SecretKeyResolver(ks, pwd);
 
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
 
         KeyInfo ki;
         X509Data x509data;
@@ -219,7 +218,7 @@
         }
 
         // Create a sample XML document
-        Document document = XMLUtils.newDocument();
+        Document document = XMLUtils.createDocumentBuilder(false).newDocument();
 
         Element rootElement = document.createElement("root");
         document.appendChild(rootElement);
@@ -339,4 +338,4 @@
             return null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/RetrievalMethodResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/RetrievalMethodResolverTest.java
index 26949d2..e9b99c5 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/RetrievalMethodResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/RetrievalMethodResolverTest.java
@@ -21,6 +21,8 @@
 import java.io.FileInputStream;
 import java.security.Security;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.utils.XMLUtils;
@@ -50,7 +52,8 @@
             fis = new FileInputStream(filename);
         }
 
-        Document doc = XMLUtils.read(fis, false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(fis);
 
         KeyInfo keyInfo = new KeyInfo(doc.getDocumentElement(), null);
 
@@ -69,7 +72,8 @@
             fis = new FileInputStream(filename);
         }
 
-        Document doc = XMLUtils.read(fis, false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(fis);
 
         KeyInfo keyInfo = new KeyInfo(doc.getDocumentElement(), null);
 
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/X509DigestResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/X509DigestResolverTest.java
index 1c70fea..42fe4d5 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/X509DigestResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/keyresolver/X509DigestResolverTest.java
@@ -22,28 +22,31 @@
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.keys.storage.StorageResolver;
 import org.apache.xml.security.keys.storage.implementations.SingleCertificateResolver;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-
-public class X509DigestResolverTest {
+public class X509DigestResolverTest extends Assert {
 
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
+    private DocumentBuilder documentBuilder;
+
     private X509Certificate certControl;
 
     private StorageResolver storageResolver;
 
     public X509DigestResolverTest() throws Exception {
+        documentBuilder = XMLUtils.createDocumentBuilder(false);
+
         certControl = loadCertificate("cert-X509Digest.crt");
 
         storageResolver = new StorageResolver(new SingleCertificateResolver(certControl));
@@ -80,7 +83,7 @@
     }
 
     private Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
     private X509Certificate loadCertificate(String fileName) throws Exception {
@@ -89,4 +92,4 @@
         return (X509Certificate) certFactory.generateCertificate(fis);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/storage/KeyStoreResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/storage/KeyStoreResolverTest.java
index 2e0a28d..234462d 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/storage/KeyStoreResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/storage/KeyStoreResolverTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.keys.storage;
 
+import static org.junit.Assert.*;
 
 import java.io.FileInputStream;
 import java.security.KeyStore;
@@ -27,11 +28,6 @@
 
 import org.apache.xml.security.keys.storage.implementations.KeyStoreResolver;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
-
 /**
  * KeyStore StorageResolver test.
  */
@@ -104,4 +100,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/keys/storage/StorageResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/keys/storage/StorageResolverTest.java
index 57b1fd2..795df00 100644
--- a/src/test/java/org/apache/xml/security/test/dom/keys/storage/StorageResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/keys/storage/StorageResolverTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.keys.storage;
 
+import static org.junit.Assert.*;
 
 import java.io.FileInputStream;
 import java.security.KeyStore;
@@ -27,11 +28,6 @@
 
 import org.apache.xml.security.keys.storage.StorageResolver;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
-
 /**
  * KeyStore StorageResolver test.
  */
@@ -109,4 +105,5 @@
             //
         }
     }
-}
\ No newline at end of file
+}
+
diff --git a/src/test/java/org/apache/xml/security/test/dom/resource/TestVectorResolver.java b/src/test/java/org/apache/xml/security/test/dom/resource/TestVectorResolver.java
new file mode 100644
index 0000000..69a60c6
--- /dev/null
+++ b/src/test/java/org/apache/xml/security/test/dom/resource/TestVectorResolver.java
@@ -0,0 +1,201 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.apache.xml.security.test.dom.resource;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+/**
+ * This package is responsible for retrieving test vectors for our unit tests.
+ *
+ * $todo$ Currently, the test vectors are in the file system under the data/ directory.
+ * It is planned to put them all into a single jar/zip which is deployed with the library.
+ */
+public class TestVectorResolver implements EntityResolver {
+
+    static org.slf4j.Logger LOG =
+        org.slf4j.LoggerFactory.getLogger(TestVectorResolver.class);
+
+    /** Field alreadyInitialized */
+    static boolean alreadyInitialized = false;
+
+    /** Field zis */
+    static java.util.zip.ZipInputStream zis = null;
+
+    /** Field vectors */
+    static java.util.Map<String, byte[]> vectors = null;
+
+    static {
+        org.apache.xml.security.Init.init();
+        TestVectorResolver.init();
+    }
+
+    /** Field _firstEntityResolved */
+    boolean _firstEntityResolved = false;
+
+    /** Field _firstEntitySystemId */
+    String _firstEntitySystemIdDirectory = null;
+
+    /**
+     * Method init
+     *
+     */
+    public static void init() {
+        String thisClass =
+            "org.apache.xml.security.test.resource.TestVectorResolver";
+        String testVectorFile = "testvectors.zip";
+
+        if (!TestVectorResolver.alreadyInitialized) {
+            TestVectorResolver.alreadyInitialized = true;
+            TestVectorResolver.vectors = new java.util.HashMap<String, byte[]>(30);
+
+            try {
+                zis =
+                    new java.util.zip.ZipInputStream(
+                         Class.forName(thisClass).getResourceAsStream(testVectorFile)
+                     );
+
+                java.util.zip.ZipEntry ze = null;
+                while ((ze = zis.getNextEntry()) != null) {
+                    if (!ze.isDirectory()) {
+                        byte data[] =
+                            org.apache.xml.security.utils.JavaUtils.getBytesFromStream(zis);
+
+                        TestVectorResolver.vectors.put(ze.getName(), data);
+                        LOG.debug("Contents of " + thisClass + "/" + testVectorFile
+                                  + "#" + ze.getName() + " " + data.length + " bytes");
+                    }
+                }
+            } catch (ClassNotFoundException e) {
+                //
+            }
+            catch (IOException e) {
+                //
+            }
+        }
+    }
+
+    /**
+     * Method getCurrentDir
+     *
+     *
+     * @throws IOException
+     */
+    private String getCurrentDir() throws IOException {
+
+        String currentDir = new File(".").getCanonicalPath();
+
+        currentDir = currentDir.replace(File.separatorChar, '/');
+        currentDir = "file:///" + currentDir + "/";
+
+        return currentDir;
+    }
+
+    /**
+     * Method getFileName
+     *
+     * @param systemId
+     *
+     * @throws IOException
+     */
+    private String getFileName(String systemId) throws IOException {
+
+        // clean up file name
+        String currentDir = getCurrentDir();
+
+        if (systemId.startsWith(currentDir)) {
+            return systemId.substring(currentDir.length());
+        } else {
+            return systemId;
+        }
+    }
+
+    /**
+     * Method getFilePath
+     *
+     * @param systemId
+     *
+     * @throws IOException
+     */
+    private String getFilePath(String systemId) throws IOException {
+
+        String t = new File(systemId).getCanonicalPath();
+
+        t = t.replace(File.separatorChar, '/');
+        t = "file:///" + t;
+
+        String currentDir = getCurrentDir();
+
+        if (t.startsWith(currentDir)) {
+            t = t.substring(currentDir.length());
+        }
+
+        t = t.substring(0, t.lastIndexOf("/"));
+
+        return t;
+    }
+
+    /**
+     * Method set1stSystemId
+     *
+     * @param systemId
+     * @throws IOException
+     */
+    private void set1stSystemId(String systemId) throws IOException {
+
+        this._firstEntitySystemIdDirectory = getFilePath(systemId);
+
+        LOG.debug("this._firstEntitySystemIdDirectory = "
+                  + this._firstEntitySystemIdDirectory);
+    }
+
+    /**
+     * Method resolveEntity
+     *
+     * @param publicId
+     * @param systemId
+     *
+     */
+    public InputSource resolveEntity(String publicId, String systemId) {
+        try {
+            if (!this._firstEntityResolved) {
+                this.set1stSystemId(systemId);
+            }
+
+            systemId = this.getFileName(systemId);
+
+            LOG.debug("publicId=\"" + publicId + "\" systemId=\"" + systemId
+                      + "\"");
+
+            // InputStream result = this.getInputStream(systemId);
+            // return new InputSource(result);
+            return new InputSource(new FileInputStream(systemId));
+        } catch (FileNotFoundException ex) {
+            return null;
+        } catch (IOException ex) {
+            return null;
+        }
+    }
+
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenAlgorithmTest.java b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenAlgorithmTest.java
index 06daae6..9000360 100644
--- a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenAlgorithmTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenAlgorithmTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.xml.security.test.dom.secure_val;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
 
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.signature.XMLSignatureException;
@@ -29,11 +29,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 
 /**
  * This is a test for a forbidden algorithm (MD5) when secure validation is enabled.
@@ -64,7 +59,7 @@
         } catch (XMLSignatureException ex) {
             String error = "It is forbidden to use algorithm http://www.w3.org/2001/04/xmldsig-more#md5 "
                 + "when secure validation is enabled";
-            assertEquals(ex.getMessage(), error);
+            assertTrue(ex.getMessage().equals(error));
         }
     }
 
@@ -78,7 +73,8 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         Element sigElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
@@ -87,4 +83,4 @@
         return signature.checkSignatureValue(signature.getKeyInfo().getPublicKey());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRefCountTest.java b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRefCountTest.java
index ed8d40f..731fc74 100644
--- a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRefCountTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRefCountTest.java
@@ -18,41 +18,23 @@
  */
 package org.apache.xml.security.test.dom.secure_val;
 
+import static org.junit.Assert.*;
 
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.security.KeyStore;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.util.Enumeration;
-
-import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.signature.XMLSignature;
-import org.apache.xml.security.signature.XMLSignatureException;
+import org.apache.xml.security.signature.Manifest;
 import org.apache.xml.security.test.dom.interop.InteropTestBase;
-import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
-import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 
 /**
  * This is a test for a forbidden number of references when secure validation is enabled.
  */
 public class ForbiddenRefCountTest extends InteropTestBase {
 
-    private static final String BASEDIR =
-        System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
-    public static final String KEYSTORE_DIRECTORY = BASEDIR + "/src/test/resources/";
-    public static final String KEYSTORE_PASSWORD_STRING = "changeit";
-    public static final char[] KEYSTORE_PASSWORD = KEYSTORE_PASSWORD_STRING.toCharArray();
-
     static org.slf4j.Logger LOG =
         org.slf4j.LoggerFactory.getLogger(ForbiddenRefCountTest.class);
 
@@ -66,82 +48,37 @@
 
     @org.junit.Test
     public void testReferenceCount() throws Exception {
-        Document doc = getOriginalDocument();
-        signDocument(doc, 31);
-        assertTrue(verifySignature(doc, false));
+        boolean success =
+            readAndVerifyManifest("src/test/resources/interop/c14n/Y4", "signature-manifest.xml", false);
+
+        assertTrue(success);
 
         try {
-            verifySignature(doc, true);
+            readAndVerifyManifest("src/test/resources/interop/c14n/Y4", "signature-manifest.xml", true);
             fail("Failure expected when secure validation is enabled");
         } catch (XMLSecurityException ex) {
             assertTrue(ex.getMessage().contains("references are contained in the Manifest"));
         }
     }
 
-    private Document getOriginalDocument() throws ParserConfigurationException {
-        Document doc = XMLUtils.newDocument();
-
-        Element rootElement = doc.createElementNS("http://ns.example.org/", "root");
-        rootElement.appendChild(doc.createTextNode("Hello World!"));
-        doc.appendChild(rootElement);
-
-        return doc;
-    }
-
-    private void signDocument(Document doc, int refCount) throws Exception {
-        XMLSignature sig = new XMLSignature(doc, "", XMLSignature.ALGO_ID_SIGNATURE_DSA);
-        Element root = doc.getDocumentElement();
-        root.appendChild(sig.getElement());
-
-        for (int i = 0; i < refCount; i++) {
-            Transforms transforms = new Transforms(doc);
-            transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
-            transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS);
-            sig.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1);
+    private boolean readAndVerifyManifest(
+        String directory, String file, boolean secValidation
+    ) throws Exception {
+        String basedir = System.getProperty("basedir");
+        if (basedir != null && !"".equals(basedir)) {
+            directory = basedir + "/" + directory;
         }
 
-        sig.addKeyInfo(getPublicKey());
-        sig.sign(getPrivateKey());
-    }
+        File f = new File(directory + "/" + file);
 
-    private boolean verifySignature(Document doc, boolean secValidation) throws XMLSignatureException, XMLSecurityException {
-        Element sigElement =
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        org.w3c.dom.Document doc = db.parse(f);
+
+        Element manifestElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
-                                                 Constants._TAG_SIGNATURE).item(0);
-        XMLSignature signature = new XMLSignature(sigElement, null, secValidation);
-        return signature.checkSignatureValue(signature.getKeyInfo().getPublicKey());
+                                                 Constants._TAG_SIGNEDINFO).item(0);
+        Manifest manifest = new Manifest(manifestElement, f.toURI().toURL().toString(), secValidation);
+        return manifest.verifyReferences();
     }
 
-    private KeyStore getKeyStore() throws Exception {
-        KeyStore ks = KeyStore.getInstance("JKS");
-        InputStream ksis = new FileInputStream(KEYSTORE_DIRECTORY + "test.jks");
-        ks.load(ksis, KEYSTORE_PASSWORD);
-        ksis.close();
-        return ks;
-    }
-
-    private PublicKey getPublicKey() throws Exception {
-        KeyStore keyStore = getKeyStore();
-        Enumeration<String> aliases = keyStore.aliases();
-        while (aliases.hasMoreElements()) {
-            String alias = aliases.nextElement();
-            if (keyStore.isKeyEntry(alias)) {
-                return keyStore.getCertificate(alias).getPublicKey();
-            }
-        }
-        return null;
-    }
-
-    private PrivateKey getPrivateKey() throws Exception {
-        KeyStore keyStore = getKeyStore();
-        Enumeration<String> aliases = keyStore.aliases();
-        while (aliases.hasMoreElements()) {
-            String alias = aliases.nextElement();
-            if (keyStore.isKeyEntry(alias)) {
-                return (PrivateKey) keyStore.getKey(alias, KEYSTORE_PASSWORD);
-            }
-        }
-        return null;
-    }
-
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenReferenceTest.java b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenReferenceTest.java
index 3bd027d..013a550 100644
--- a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenReferenceTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenReferenceTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.xml.security.test.dom.secure_val;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
 
 import org.apache.xml.security.signature.Manifest;
 import org.apache.xml.security.signature.MissingResourceFailureException;
@@ -29,10 +29,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 
 /**
  * This is a test for a forbidden Reference algorithm when secure validation is enabled.
@@ -75,7 +71,9 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        org.w3c.dom.Document doc = db.parse(f);
+        XMLUtils.repoolDocumentBuilder(db);
 
         Element manifestElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
@@ -84,4 +82,4 @@
         return manifest.verifyReferences();
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRetrievalMethodTest.java b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRetrievalMethodTest.java
index ae1844e..4065d30 100644
--- a/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRetrievalMethodTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/secure_val/ForbiddenRetrievalMethodTest.java
@@ -18,15 +18,16 @@
  */
 package org.apache.xml.security.test.dom.secure_val;
 
+import static org.junit.Assert.assertNull;
 
 import java.io.FileInputStream;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertNull;
-
 
 /**
  * This is a test for a Retrieval Method pointing to another Retrieval Method (forbidden under
@@ -51,7 +52,8 @@
             fis = new FileInputStream(filename);
         }
 
-        Document doc = XMLUtils.read(fis, false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(fis);
 
         KeyInfo keyInfo = new KeyInfo(doc.getDocumentElement(), null);
         keyInfo.setSecureValidation(true);
@@ -61,4 +63,4 @@
         assertNull(keyInfo.getX509Certificate());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/secure_val/WrappingAttackTest.java b/src/test/java/org/apache/xml/security/test/dom/secure_val/WrappingAttackTest.java
index 5d0b183..b2826ac 100644
--- a/src/test/java/org/apache/xml/security/test/dom/secure_val/WrappingAttackTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/secure_val/WrappingAttackTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.xml.security.test.dom.secure_val;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
-import java.io.FileInputStream;
 
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.signature.XMLSignatureException;
@@ -29,10 +29,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 
 /**
  * This is a test for a wrapping attack.
@@ -80,7 +76,8 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         Element sigElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
@@ -99,7 +96,8 @@
 
         File f = new File(directory + "/" + file);
 
-        org.w3c.dom.Document doc = XMLUtils.read(new FileInputStream(f), false);
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false, false);
+        org.w3c.dom.Document doc = db.parse(f);
 
         Element sigElement =
             (Element) doc.getElementsByTagNameNS(Constants.SignatureSpecNS,
@@ -113,4 +111,4 @@
         return signature.checkSignatureValue(signature.getKeyInfo().getPublicKey());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java
index 7b1f2e5..646ef3b 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/CreateSignatureTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -51,8 +52,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-
 /**
  * Tests that create signatures.
  *
@@ -66,8 +65,10 @@
     private static final String SEP = System.getProperty("file.separator");
 
     private KeyPair kp;
+    private javax.xml.parsers.DocumentBuilder db;
 
     public CreateSignatureTest() throws Exception {
+        db = XMLUtils.createDocumentBuilder(false);
         org.apache.xml.security.Init.init();
         kp = KeyPairGenerator.getInstance("RSA").genKeyPair();
     }
@@ -78,7 +79,7 @@
      */
     @org.junit.Test
     public void testEmptyNodeSet() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         Element envelope = doc.createElementNS("http://www.usps.gov/", "Envelope");
         envelope.appendChild(doc.createTextNode("\n"));
         doc.appendChild(envelope);
@@ -153,7 +154,7 @@
 
     @org.junit.Test
     public void testXFilter2Signature() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         doc.appendChild(doc.createComment(" Comment before "));
         Element root = doc.createElementNS("", "RootElement");
 
@@ -196,7 +197,7 @@
 
         // Now Verify
         try (InputStream is = new ByteArrayInputStream(signedDoc.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
 
         XPathFactory xpf = XPathFactory.newInstance();
@@ -217,7 +218,7 @@
 
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(signedXML.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
 
         XPathFactory xpf = XPathFactory.newInstance();
@@ -256,7 +257,7 @@
     @org.junit.Test
     public void testSHA256Digest() throws Exception {
         PrivateKey privateKey = kp.getPrivate();
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         doc.appendChild(doc.createComment(" Comment before "));
         Element root = doc.createElementNS("", "RootElement");
 
@@ -294,7 +295,7 @@
 
     private String doSign() throws Exception {
         PrivateKey privateKey = kp.getPrivate();
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         doc.appendChild(doc.createComment(" Comment before "));
         Element root = doc.createElementNS("", "RootElement");
 
@@ -339,7 +340,7 @@
         }
         ks.load(fis, "changeit".toCharArray());
         PrivateKey privateKey = (PrivateKey) ks.getKey("mullan", "changeit".toCharArray());
-        Document doc = XMLUtils.newDocument();
+        Document doc = db.newDocument();
         X509Certificate signingCert = (X509Certificate) ks.getCertificate("mullan");
         doc.appendChild(doc.createComment(" Comment before "));
         Element root = doc.createElementNS("", "RootElement");
@@ -378,7 +379,7 @@
     private void doVerify(String signedXML) throws Exception {
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(signedXML.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
 
         XPathFactory xpf = XPathFactory.newInstance();
@@ -403,4 +404,4 @@
         assertTrue(signature.checkSignatureValue(pk));
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/ECDSASignatureTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/ECDSASignatureTest.java
index 2533be5..2100520 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/ECDSASignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/ECDSASignatureTest.java
@@ -46,7 +46,6 @@
 
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Tests that creates and verifies ECDSA signatures.
  *
@@ -59,11 +58,14 @@
         "src/test/resources/org/apache/xml/security/samples/input/ecdsa.jks";
     private static final String ECDSA_JKS_PASSWORD = "security";
 
+    private javax.xml.parsers.DocumentBuilder db;
+
     public ECDSASignatureTest() throws Exception {
 
         //String id = "http://apache.org/xml/properties/dom/document-class-name";
         //dbf.setAttribute(id, IndexedDocument.class.getName());
 
+        db = XMLUtils.createDocumentBuilder(false);
         org.apache.xml.security.Init.init();
     }
 
@@ -123,7 +125,7 @@
     }
 
     private byte[] doSign(PrivateKey privateKey, X509Certificate x509, PublicKey publicKey) throws Exception {
-        org.w3c.dom.Document doc = XMLUtils.newDocument();
+        org.w3c.dom.Document doc = db.newDocument();
         doc.appendChild(doc.createComment(" Comment before "));
         Element root = doc.createElementNS("", "RootElement");
 
@@ -168,7 +170,7 @@
     }
 
     private void doVerify(InputStream is) throws Exception {
-        org.w3c.dom.Document doc = XMLUtils.read(is, false);
+        org.w3c.dom.Document doc = this.db.parse(is);
 
         XPathFactory xpf = XPathFactory.newInstance();
         XPath xpath = xpf.newXPath();
@@ -276,4 +278,4 @@
     }
      */
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/HMACOutputLengthTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/HMACOutputLengthTest.java
index 3bdd180..4887ccb 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/HMACOutputLengthTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/HMACOutputLengthTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.fail;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.nio.charset.StandardCharsets;
 
 import javax.crypto.SecretKey;
@@ -35,8 +35,6 @@
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
 
-import static org.junit.Assert.fail;
-
 public class HMACOutputLengthTest {
 
     static org.slf4j.Logger LOG =
@@ -58,7 +56,7 @@
             fail("Expected HMACOutputLength exception");
         } catch (XMLSignatureException xse) {
             // System.out.println(xse.getMessage());
-            if (!"algorithms.HMACOutputLengthMin".equals(xse.getMsgID())) {
+            if (!xse.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(xse.getMessage());
             }
         }
@@ -70,7 +68,7 @@
             validate("signature-enveloping-hmac-sha1-trunclen-8-attack.xml");
         } catch (XMLSignatureException xse) {
             // System.out.println(xse.getMessage());
-            if (!"algorithms.HMACOutputLengthMin".equals(xse.getMsgID())) {
+            if (!xse.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(xse.getMessage());
             }
         }
@@ -78,7 +76,7 @@
 
     @org.junit.Test
     public void test_generate_hmac_sha1_40() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         XMLSignature sig =
             new XMLSignature(
                 doc, null, XMLSignature.ALGO_ID_MAC_HMAC_SHA1,
@@ -89,7 +87,7 @@
             fail("Expected HMACOutputLength Exception");
         } catch (XMLSignatureException xse) {
             // System.out.println(xse.getMessage());
-            if (!"algorithms.HMACOutputLengthMin".equals(xse.getMsgID())) {
+            if (!xse.getMsgID().equals("algorithms.HMACOutputLengthMin")) {
                 fail(xse.getMessage());
             }
         }
@@ -100,7 +98,7 @@
             new File(BASEDIR + SEP + "src/test/resources" + SEP + "javax" + SEP + "xml"
                      + SEP + "crypto" + SEP + "dsig" + SEP, data);
 
-        Document doc = XMLUtils.read(new FileInputStream(file), false);
+        Document doc = XMLUtils.createDocumentBuilder(false).parse(file);
         NodeList nl =
             doc.getElementsByTagNameNS(Constants.SignatureSpecNS, "Signature");
         if (nl.getLength() == 0) {
@@ -121,4 +119,4 @@
         };
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/InvalidKeyTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/InvalidKeyTest.java
index 1f0ec15..1eea9c4 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/InvalidKeyTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/InvalidKeyTest.java
@@ -65,7 +65,7 @@
         FileInputStream is = new FileInputStream(BASEDIR + SEP +
             "src/test/resources/org/apache/xml/security/samples/input/test-assertion.xml");
 
-        Document e = XMLUtils.read(is, false);
+        Document e = XMLUtils.createDocumentBuilder(false).parse(is);
 
         Node assertion = e.getFirstChild();
         while (!(assertion instanceof Element)) {
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/KeyValueTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/KeyValueTest.java
index 4670b99..754ca62 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/KeyValueTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/KeyValueTest.java
@@ -18,11 +18,14 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.assertNotNull;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.security.PublicKey;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -33,17 +36,21 @@
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
 
-import static org.junit.Assert.assertNotNull;
-
 public class KeyValueTest {
 
     private static final String BASEDIR = System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
+    private DocumentBuilder db;
+
     static {
         Init.init();
     }
 
+    public KeyValueTest() throws Exception {
+        db = XMLUtils.createDocumentBuilder(false);
+    }
+
     @org.junit.Test
     public void testDSAPublicKey() throws Exception {
         File f = null;
@@ -54,7 +61,7 @@
         } else {
             f = new File(filename);
         }
-        Document doc = XMLUtils.read(new FileInputStream(f), false);
+        Document doc = db.parse(new FileInputStream(f));
         NodeList nl = doc.getElementsByTagNameNS(Constants.SignatureSpecNS, "Signature");
         XMLSignature sig = new XMLSignature
             ((Element) nl.item(0), f.toURI().toURL().toString());
@@ -64,4 +71,4 @@
         assertNotNull(pk);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/NoKeyInfoTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/NoKeyInfoTest.java
index adadfde..6f81aa7 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/NoKeyInfoTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/NoKeyInfoTest.java
@@ -18,10 +18,13 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.assertNull;
 
 import java.io.File;
 import java.io.FileInputStream;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -31,8 +34,6 @@
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.XMLUtils;
 
-import static org.junit.Assert.assertNull;
-
 public class NoKeyInfoTest {
 
     private static final String BASEDIR = System.getProperty("basedir");
@@ -42,6 +43,12 @@
         Init.init();
     }
 
+    private DocumentBuilder db;
+
+    public NoKeyInfoTest() throws Exception {
+        db = XMLUtils.createDocumentBuilder(false);
+    }
+
     @org.junit.Test
     public void testNullKeyInfo() throws Exception {
         File f = null;
@@ -52,7 +59,7 @@
         } else {
             f = new File(filename);
         }
-        Document doc = XMLUtils.read(new FileInputStream(f), false);
+        Document doc = db.parse(new FileInputStream(f));
         NodeList nl = doc.getElementsByTagNameNS(Constants.SignatureSpecNS, "Signature");
         XMLSignature sig = new XMLSignature
             ((Element) nl.item(0), f.toURI().toURL().toString());
@@ -60,4 +67,4 @@
         assertNull(ki);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/PreCalculatedDigestSignatureTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/PreCalculatedDigestSignatureTest.java
index c48e1fc..7108ad1 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/PreCalculatedDigestSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/PreCalculatedDigestSignatureTest.java
@@ -37,7 +37,10 @@
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.File;
 import java.io.FileInputStream;
@@ -50,7 +53,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-
 public class PreCalculatedDigestSignatureTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(PreCalculatedDigestSignatureTest.class);
@@ -119,8 +121,9 @@
         assertTrue(signature.checkSignatureValue(signingCert));
     }
 
-    private XMLSignature openSignature(String signatureFile) throws Exception {
-        Document document = XMLUtils.read(new FileInputStream(new File(signatureFile)), false);
+    private XMLSignature openSignature(String signatureFile) throws ParserConfigurationException, SAXException, IOException, XMLSecurityException {
+        DocumentBuilder builder = createDocumentBuilder();
+        Document document = builder.parse(new File(signatureFile));
         Element root = document.getDocumentElement();
         Element signatureDocument = (Element) root.getFirstChild();
         String baseURI = "";
@@ -136,7 +139,8 @@
     }
 
     private XMLSignature createXmlSignature() throws ParserConfigurationException, XMLSecurityException {
-        Document signatureDocument = XMLUtils.newDocument();
+        DocumentBuilder documentBuilder = createDocumentBuilder();
+        Document signatureDocument = documentBuilder.newDocument();
         Element root = createSignatureRoot(signatureDocument);
 
         String baseURI = "";
@@ -148,6 +152,12 @@
         return signature;
     }
 
+    private DocumentBuilder createDocumentBuilder() throws ParserConfigurationException {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+        return documentBuilderFactory.newDocumentBuilder();
+    }
+
     private Transforms createTransformsForSignature(Document signatureDocument) throws TransformationException {
         Transforms transforms = new Transforms(signatureDocument);
         transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
@@ -233,4 +243,4 @@
             return uriAttr.getNodeValue();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/ProcessingInstructionTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/ProcessingInstructionTest.java
index f54cca3..89fc2fa 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/ProcessingInstructionTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/ProcessingInstructionTest.java
@@ -24,6 +24,7 @@
 import java.net.URISyntaxException;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -62,8 +63,9 @@
     @org.junit.Test
     public void testProcessingInstruction() throws Exception {
         String signatureFileName = dir + "upp_sign.xml";
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         File f = new File(signatureFileName);
-        Document doc = XMLUtils.read(new FileInputStream(f), false);
+        Document doc = db.parse(new FileInputStream(f));
 
         Node obj =
             doc.getElementsByTagNameNS("http://uri.etsi.org/01903/v1.3.2#", "QualifyingProperties").item(0);
@@ -133,7 +135,10 @@
 
         @Override
         public boolean engineCanResolveURI(ResourceResolverContext context) {
-            return !(context.uriToResolve == null || !"out.xml".equals(context.uriToResolve));
+            if (context.uriToResolve == null || !"out.xml".equals(context.uriToResolve)) {
+                return false;
+            }
+            return true;
         }
 
         private static URI getNewURI(String uri, String baseURI) throws URISyntaxException {
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/Santuario499Test.java b/src/test/java/org/apache/xml/security/test/dom/signature/Santuario499Test.java
index 44ef370..542ea93 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/Santuario499Test.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/Santuario499Test.java
@@ -53,7 +53,7 @@
         URL signatureFile = this.getClass().getResource("Arbeidstijd_anonymous.xml");
         assertNotNull(signatureFile);
 
-        Document doc = XMLUtils.read(signatureFile.openStream(), false);
+        Document doc = XMLUtils.createDocumentBuilder(false).parse(signatureFile.openStream());
 
         XPathFactory xpf = XPathFactory.newInstance();
         XPath xpath = xpf.newXPath();
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/SignatureReferenceTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/SignatureReferenceTest.java
index 81b7277..6f38504 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/SignatureReferenceTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/SignatureReferenceTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.*;
 
 import java.io.FileInputStream;
 import java.io.InputStream;
@@ -28,6 +29,7 @@
 import java.util.List;
 
 import javax.xml.crypto.dsig.DigestMethod;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
@@ -56,13 +58,6 @@
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 import org.apache.xml.security.utils.resolver.implementations.ResolverXPointer;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Test a Signature and Validation, and check that we have access to the Element(s) that was
  * validated.
@@ -101,7 +96,7 @@
         Element referenceElement =
             (Element)((ReferenceNodeSetData)referenceData).iterator().next();
         assertNotNull(referenceElement);
-        assertEquals("root", referenceElement.getLocalName());
+        assertTrue("root".equals(referenceElement.getLocalName()));
 
         Element originalElement =
             (Element) doc.getElementsByTagNameNS("http://ns.example.org/", "root").item(0);
@@ -112,7 +107,8 @@
     // See SANTUARIO-465
     @org.junit.Test
     public void testNoReferenceChildren() throws ParserConfigurationException, XMLSecurityException {
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(true);
+        Document doc = db.newDocument();
         Element referenceElement = doc.createElementNS(Constants.SignatureSpecNS, "Reference");
         referenceElement.setAttributeNS(null, "URI", "#_12345");
 
@@ -142,6 +138,8 @@
         referenceElement.appendChild(digestValue);
 
         new WrappedReference(referenceElement, "_54321", null);
+
+        XMLUtils.repoolDocumentBuilder(db);
     }
 
     @org.junit.Test
@@ -154,7 +152,8 @@
         InputStream sourceDocument =
             this.getClass().getClassLoader().getResourceAsStream(
                     "at/iaik/ixsil/coreFeatures/signatures/manifestSignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false, false);
+        Document document = builder.parse(sourceDocument);
 
         String expression = "//dsig:Signature[1]";
         Element sigElement =
@@ -189,6 +188,8 @@
         assertEquals(1, verifiedReferences.get(0).getManifestReferences().size());
         assertEquals("../samples/sampleXMLData.xml", verifiedReferences.get(0).getManifestReferences().get(0).getUri());
         assertFalse(verifiedReferences.get(0).getManifestReferences().get(0).isValid());
+
+        XMLUtils.repoolDocumentBuilder(builder);
     }
 
     /**
@@ -230,7 +231,8 @@
     }
 
     private Document getOriginalDocument() throws Throwable {
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
 
         Element rootElement = doc.createElementNS("http://ns.example.org/", "root");
         rootElement.appendChild(doc.createTextNode("Hello World!"));
@@ -281,4 +283,4 @@
         }
 
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/SignatureTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/SignatureTest.java
index 1efefe0..b29838c 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/SignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/SignatureTest.java
@@ -20,6 +20,7 @@
 
 import java.io.InputStream;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.FileInputStream;
 import java.security.KeyStore;
@@ -27,6 +28,8 @@
 import java.security.PublicKey;
 import java.util.Enumeration;
 
+import javax.xml.parsers.DocumentBuilder;
+
 import org.apache.xml.security.Init;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.signature.XMLSignatureException;
@@ -38,8 +41,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertTrue;
-
 public class SignatureTest {
     public static final String DS_NS = "http://www.w3.org/2000/09/xmldsig#";
 
@@ -172,7 +173,8 @@
     }
 
     private Document getOriginalDocument() throws Throwable {
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
 
         Element rootElement = doc.createElementNS("http://ns.example.org/", "root");
         rootElement.appendChild(doc.createTextNode("Hello World!"));
@@ -198,4 +200,4 @@
 
         return sig;
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/UnknownAlgoSignatureTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/UnknownAlgoSignatureTest.java
index b2d5693..90f63b2 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/UnknownAlgoSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/UnknownAlgoSignatureTest.java
@@ -18,28 +18,36 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
 import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
 import java.security.PublicKey;
+import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
 import org.apache.xml.security.Init;
 import org.apache.xml.security.c14n.InvalidCanonicalizerException;
+import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.signature.XMLSignatureException;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import org.xml.sax.SAXException;
 
 /**
  * Tests cases where signature algorithms are unknown.
@@ -69,7 +77,8 @@
         Init.init();
     }
 
-    public UnknownAlgoSignatureTest() throws Exception {
+    public UnknownAlgoSignatureTest() throws KeyStoreException, NoSuchAlgorithmException,
+        CertificateException, IOException {
         FileInputStream fis = null;
         if (BASEDIR != null && !"".equals(BASEDIR)) {
             fis = new FileInputStream(BASEDIR + SEP + KEYSTORE_FILE);
@@ -83,12 +92,14 @@
     }
 
     @org.junit.Test
-    public void testGood() throws Exception {
+    public void testGood() throws ParserConfigurationException, SAXException,
+        IOException, TransformerException, XMLSignatureException, XMLSecurityException, XPathExpressionException {
         assertTrue(checkSignature("signature-good.xml"));
     }
 
     @org.junit.Test
-    public void testBadC14NAlgo() throws Exception {
+    public void testBadC14NAlgo() throws ParserConfigurationException,
+        SAXException, IOException, TransformerException, XMLSecurityException, XPathExpressionException {
         try {
             assertTrue(checkSignature("signature-bad-c14n-algo.xml"));
             fail("Exception not caught");
@@ -98,7 +109,8 @@
     }
 
     @org.junit.Test
-    public void testBadSigAlgo() throws Exception {
+    public void testBadSigAlgo() throws ParserConfigurationException,
+        SAXException, IOException, TransformerException, XMLSecurityException, XPathExpressionException {
         try {
             assertTrue(checkSignature("signature-bad-sig-algo.xml"));
             fail("Exception not caught");
@@ -108,7 +120,8 @@
     }
 
     @org.junit.Test
-    public void testBadTransformAlgo() throws Exception {
+    public void testBadTransformAlgo() throws ParserConfigurationException,
+        SAXException, IOException, TransformerException, XMLSecurityException, XPathExpressionException {
         try {
             assertTrue(checkReferences("signature-bad-transform-algo.xml"));
             fail("Exception not caught");
@@ -117,17 +130,23 @@
         }
     }
 
-    protected boolean checkSignature(String fileName) throws Exception {
+    protected boolean checkSignature(String fileName)
+        throws ParserConfigurationException, SAXException, IOException,
+        TransformerException, XMLSecurityException, XPathExpressionException {
         XMLSignature signature = unmarshalXMLSignature(fileName);
         return signature.checkSignatureValue(publicKey);
     }
 
-    protected boolean checkReferences(String fileName) throws Exception {
+    protected boolean checkReferences(String fileName)
+        throws ParserConfigurationException, SAXException, IOException,
+        TransformerException, XMLSecurityException, XPathExpressionException {
         XMLSignature signature = unmarshalXMLSignature(fileName);
         return signature.getSignedInfo().verify(false);
     }
 
-    private XMLSignature unmarshalXMLSignature(String fileName) throws Exception {
+    private XMLSignature unmarshalXMLSignature(String fileName)
+        throws ParserConfigurationException, SAXException, IOException,
+        TransformerException, XMLSecurityException, XPathExpressionException {
         File file = null;
         if (BASEDIR != null && !"".equals(BASEDIR)) {
             file = new File(BASEDIR + SEP + SIGNATURE_SOURCE_PATH, fileName);
@@ -146,8 +165,11 @@
         return new XMLSignature(sigElement, file.toURI().toURL().toString());
     }
 
-    public static Document getDocument(File file) throws Exception {
-        return XMLUtils.read(new FileInputStream(file), false);
+    public static Document getDocument(File file)
+        throws ParserConfigurationException, SAXException, IOException {
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new FileInputStream(file));
+        return doc;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/X509DataTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/X509DataTest.java
index 814e1ff..34b79d7 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/X509DataTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/X509DataTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -33,10 +34,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-
 public class X509DataTest {
 
     private static final String BASEDIR = System.getProperty("basedir");
@@ -47,7 +44,8 @@
     public void testAddX509SubjectName() throws Exception {
         Init.init();
 
-        Document doc = XMLUtils.newDocument();
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
         XMLSignature sig = new XMLSignature(doc, "", XMLSignature.ALGO_ID_SIGNATURE_DSA);
 
         doc.appendChild(sig.getElement());
@@ -77,9 +75,10 @@
 
     private XMLSignature getSignature(byte[] s) throws Exception {
 
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(s)) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         Element el = (Element)doc.getFirstChild();
         return new XMLSignature(el, "");
@@ -119,4 +118,4 @@
         return privateKey;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/XMLSignatureInputTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/XMLSignatureInputTest.java
index 0b3e830..d5872e9 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/XMLSignatureInputTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/XMLSignatureInputTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.signature;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -28,10 +29,6 @@
 import org.apache.xml.security.c14n.InvalidCanonicalizerException;
 import org.apache.xml.security.signature.XMLSignatureInput;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 /**
  * Unit test for {@link org.apache.xml.security.signature.XMLSignatureInput}
  *
@@ -98,17 +95,17 @@
         int off = 0;
 
         while (res.available() > 0) {
-            byte[] array = new byte[1024];
+            byte array[] = new byte[1024];
             int len = res.read(array);
 
             baos.write(array, off, len);
             off += len;
         }
 
-        byte[] resBytes = baos.toByteArray();
+        byte resBytes[] = baos.toByteArray();
         String resString = new String(resBytes, java.nio.charset.StandardCharsets.UTF_8);
 
-        assertEquals(resString, _octetStreamTextInput);
+        assertTrue(resString.equals(_octetStreamTextInput));
     }
 
     @org.junit.Test
@@ -137,7 +134,7 @@
             new ByteArrayInputStream(_octetStreamTextInput.getBytes())) {
             XMLSignatureInput input = new XMLSignatureInput(inputStream);
 
-            assertFalse("Input is not node set", input.isNodeSet());
+            assertTrue("Input is not node set", !input.isNodeSet());
         }
     }
 
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/XPointerResourceResolver.java b/src/test/java/org/apache/xml/security/test/dom/signature/XPointerResourceResolver.java
index 8fd9279..97b127e 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/XPointerResourceResolver.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/XPointerResourceResolver.java
@@ -75,7 +75,7 @@
             return false;
         }
 
-        String[] parts = xpURI.substring(1).split("\\s");
+        String parts[] = xpURI.substring(1).split("\\s");
 
         // plain ID reference.
         if (parts.length == 1 && !parts[0].startsWith(XNS_OPEN)) {
@@ -116,7 +116,7 @@
             return null;
         }
 
-        String[] parts = xpURI.substring(1).split("\\s");
+        String parts[] = xpURI.substring(1).split("\\s");
 
         int i = 0;
         Map<String, String> namespaces = new HashMap<>();
diff --git a/src/test/java/org/apache/xml/security/test/dom/signature/XmlSecTest.java b/src/test/java/org/apache/xml/security/test/dom/signature/XmlSecTest.java
index 75fe551..973b008 100644
--- a/src/test/java/org/apache/xml/security/test/dom/signature/XmlSecTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/signature/XmlSecTest.java
@@ -26,6 +26,7 @@
 import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -44,7 +45,6 @@
 
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Tests creating and validating an XML Signature with an XPath Transform.
  * Tests bug #44617.
@@ -71,7 +71,8 @@
 
     private void checkXmlSignatureSoftwareStack(boolean cert) throws Exception {
         Init.init();
-        Document testDocument = XMLUtils.newDocument();
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(false);
+        Document testDocument = documentBuilder.newDocument();
 
         Element rootElement =
             testDocument.createElementNS("urn:namespace", "tns:document");
@@ -151,4 +152,4 @@
         assertTrue(signResult);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/transforms/EmptyNamespaceTest.java b/src/test/java/org/apache/xml/security/test/dom/transforms/EmptyNamespaceTest.java
index 22a89fc..096e8cc 100644
--- a/src/test/java/org/apache/xml/security/test/dom/transforms/EmptyNamespaceTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/transforms/EmptyNamespaceTest.java
@@ -22,9 +22,11 @@
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315ExclOmitComments;
 import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_Excl;
 import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_ExclOmitCommentsTransformer;
-import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.w3c.dom.Document;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
@@ -33,8 +35,6 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-
 public class EmptyNamespaceTest {
 
     private static final String message = "<SOAP-ENV:Body xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" wsu:Id=\"XWSSGID-1465203363337-2063525437\">\n" +
@@ -85,7 +85,7 @@
             transformer.doFinal();
 
             String result = outputStream.toString();
-            assertEquals(message, result);
+            Assert.assertEquals(message, result);
         }
     }
 
@@ -96,9 +96,13 @@
 
         Canonicalizer20010315Excl transformer = new Canonicalizer20010315ExclOmitComments();
 
+        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+        documentBuilderFactory.setValidating(false);
+        final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(message.getBytes(java.nio.charset.StandardCharsets.UTF_8))) {
-            document = XMLUtils.read(is, false);
+            document = documentBuilder.parse(is);
         }
 
         String inclusiveNamespaces = "SOAP-ENV ec ec1 ns0 ns1 ns11 ns2 ns4 ns9";
@@ -106,6 +110,6 @@
                 transformer.engineCanonicalizeSubTree(document, inclusiveNamespaces);
 
         String result = new String(output, java.nio.charset.StandardCharsets.UTF_8);
-        assertEquals(message, result);
+        Assert.assertEquals(message, result);
     }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/xml/security/test/dom/transforms/SampleTransform.java b/src/test/java/org/apache/xml/security/test/dom/transforms/SampleTransform.java
index 535da93..3b6975f 100644
--- a/src/test/java/org/apache/xml/security/test/dom/transforms/SampleTransform.java
+++ b/src/test/java/org/apache/xml/security/test/dom/transforms/SampleTransform.java
@@ -19,17 +19,12 @@
 package org.apache.xml.security.test.dom.transforms;
 
 import java.io.IOException;
-
 import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.xml.security.c14n.CanonicalizationException;
-import org.apache.xml.security.c14n.InvalidCanonicalizerException;
-import org.apache.xml.security.exceptions.AlgorithmAlreadyRegisteredException;
-import org.apache.xml.security.signature.XMLSignatureInput;
-import org.apache.xml.security.transforms.Transform;
-import org.apache.xml.security.transforms.TransformSpi;
-import org.apache.xml.security.transforms.TransformationException;
 import org.xml.sax.SAXException;
+import org.apache.xml.security.c14n.*;
+import org.apache.xml.security.exceptions.*;
+import org.apache.xml.security.signature.XMLSignatureInput;
+import org.apache.xml.security.transforms.*;
 
 public class SampleTransform extends TransformSpi {
 
diff --git a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformBase64DecodeTest.java b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformBase64DecodeTest.java
index 9fb55f1..a3e6bbe 100644
--- a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformBase64DecodeTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformBase64DecodeTest.java
@@ -18,10 +18,12 @@
  */
 package org.apache.xml.security.test.dom.transforms.implementations;
 
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
@@ -35,8 +37,6 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * Unit test for {@link org.apache.xml.security.transforms.implementations.TransformBase64Decode}
  *
@@ -69,7 +69,9 @@
         XMLSignatureInput out = t.performTransforms(in);
         String result = new String(out.getBytes());
 
-        assertEquals(result, "The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64");
+        assertTrue(
+            result.equals("The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64")
+        );
     }
 
     @org.junit.Test
@@ -91,7 +93,9 @@
         XMLSignatureInput out = t.performTransforms(t.performTransforms(in));
         String result = new String(out.getBytes());
 
-        assertEquals(result, "The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64");
+        assertTrue(
+            result.equals("The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64")
+        );
     }
 
     @org.junit.Test
@@ -106,10 +110,13 @@
             + "</Object>\n"
             ;
         //J+
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+
+        db.setErrorHandler(new org.apache.xml.security.utils.IgnoreAllErrorHandler());
 
         Document doc = null;
         try (InputStream is = new ByteArrayInputStream(input.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         //XMLUtils.circumventBug2650(doc);
 
@@ -131,14 +138,15 @@
         XMLSignatureInput out = t.performTransforms(xmlinput);
         String result = new String(out.getBytes());
 
-        assertEquals(
+        assertTrue(
             "\"" + result + "\"",
-            result, "The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64"
+            result.equals("The URI of the transform is http://www.w3.org/2000/09/xmldsig#base64")
         );
     }
 
     private static Document createDocument() throws ParserConfigurationException {
-        Document doc = XMLUtils.newDocument();
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.newDocument();
 
         if (doc == null) {
             throw new RuntimeException("Could not create a Document");
@@ -148,4 +156,4 @@
         return doc;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformXSLTTest.java b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformXSLTTest.java
index 2515c79..f45b777 100644
--- a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformXSLTTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/TransformXSLTTest.java
@@ -20,18 +20,21 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
 
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
 import org.apache.xml.security.signature.XMLSignatureInput;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.transforms.Transform;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.XMLUtils;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class TransformXSLTTest {
 
@@ -83,8 +86,9 @@
         transform.performTransform(new XMLSignatureInput(doc2));
     }
 
-    private static Document getDocument(File file) throws Exception {
-        return XMLUtils.read(new FileInputStream(file), false);
+    private static Document getDocument(File file)
+        throws ParserConfigurationException, SAXException, IOException {
+        return XMLUtils.createDocumentBuilder(false).parse(new FileInputStream(file));
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/Xpath2TransformationTest.java b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/Xpath2TransformationTest.java
index 2a85722..5b97960 100644
--- a/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/Xpath2TransformationTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/transforms/implementations/Xpath2TransformationTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.transforms.implementations;
 
+import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayInputStream;
 
@@ -27,8 +28,6 @@
 import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-
 public class Xpath2TransformationTest {
 
     static {
@@ -130,9 +129,10 @@
         "      </edoc:ObjectContent>\n" +
         "   </edoc:Object>";
 
+        javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         org.w3c.dom.Document doc = null;
         try (ByteArrayInputStream is = new ByteArrayInputStream(sig.getBytes())) {
-            doc = XMLUtils.read(is, false);
+            doc = db.parse(is);
         }
         Element sigElement =
             (Element) doc.getElementsByTagNameNS(
@@ -156,4 +156,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/DocumentBuilderPoolingTest.java b/src/test/java/org/apache/xml/security/test/dom/utils/DocumentBuilderPoolingTest.java
new file mode 100644
index 0000000..05add92
--- /dev/null
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/DocumentBuilderPoolingTest.java
@@ -0,0 +1,175 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.apache.xml.security.test.dom.utils;
+
+import org.apache.xml.security.utils.WeakObjectPool;
+import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Test;
+
+import javax.xml.parsers.DocumentBuilder;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.util.Iterator;
+import java.util.concurrent.*;
+
+import static org.junit.Assert.*;
+
+public class DocumentBuilderPoolingTest {
+
+    private static final String DOCUMENTBUILDERPROXY_CLASSNAME =
+            "org.apache.xml.security.utils.XMLUtils$DocumentBuilderProxy";
+
+    @Test
+    public void testEquals() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true);
+        assertEquals(documentBuilder, documentBuilder);
+    }
+
+    @Test
+    public void testGetValidatingDocumentBuilder() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true);
+        assertTrue(documentBuilder.isValidating());
+    }
+
+    @Test
+    public void testGetNonValidatingDocumentBuilder() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(false);
+        assertFalse(documentBuilder.isValidating());
+    }
+
+    @Test
+    public void testGetValidatingAndAllowDocTypeDeclarationsDocumentBuilder() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true, false);
+        assertTrue(documentBuilder.isValidating());
+        assertEquals(documentBuilder.getClass().getName(), DOCUMENTBUILDERPROXY_CLASSNAME);
+        assertAllowDocTypeDeclarations(documentBuilder, false);
+    }
+
+    @Test
+    public void testGetValidatingAndDisAllowDocTypeDeclarationsDocumentBuilder() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true, true);
+        assertTrue(documentBuilder.isValidating());
+        assertEquals(documentBuilder.getClass().getName(), DOCUMENTBUILDERPROXY_CLASSNAME);
+        assertAllowDocTypeDeclarations(documentBuilder, true);
+    }
+
+    private void assertAllowDocTypeDeclarations(DocumentBuilder documentBuilder, boolean allow) throws Exception {
+        Field field = documentBuilder.getClass().getDeclaredField("disAllowDocTypeDeclarations");
+        field.setAccessible(true);
+        assertEquals(allow, field.get(documentBuilder));
+    }
+
+    @Test
+    public void testNewDocumentBuilderInstances() throws Exception {
+        int count = 4;
+
+        // get all possible combinations of DocumentBuilders:
+        DocumentBuilder[] documentBuilders = new DocumentBuilder[count];
+        for (int i = 0; i < count; i++) {
+            documentBuilders[i] = XMLUtils.createDocumentBuilder(i / 2 > 0, i % 2 == 1);
+        }
+
+        //test that we got always a new instance:
+        for (int i = 0; i < count; i++) {
+            for (int j = i + 1; j < count; j++) {
+                assertNotEquals(documentBuilders[i], documentBuilders[j]);
+                assertNotSame(documentBuilders[i], documentBuilders[j]);
+            }
+        }
+    }
+
+    @Test
+    public void testRepoolingTwice() throws Exception {
+        DocumentBuilder documentBuilder = XMLUtils.createDocumentBuilder(true);
+        assertTrue(XMLUtils.repoolDocumentBuilder(documentBuilder));
+        assertFalse("can't repool the same object twice!", XMLUtils.repoolDocumentBuilder(documentBuilder));
+    }
+
+    @Test(timeout = 30000)
+    public void testPooling() throws Exception {
+        int nThreads = 8;
+        ExecutorService exec = Executors.newFixedThreadPool(nThreads);
+        Future<?>[] results = new Future[nThreads];
+        for (int i = 0; i < nThreads - 1; i++) {
+            results[i] = exec.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        while (true) {
+                            // retrieve some DocumentBuilders...
+                            DocumentBuilder documentBuilders[] = new DocumentBuilder[10];
+                            for (int j = 0; j < documentBuilders.length; j++) {
+                                documentBuilders[j] = XMLUtils.createDocumentBuilder(false);
+                                assertNotNull(documentBuilders[j]);
+                            }
+                            // ...then repool them so that another thread may pickup them again
+                            for (int j = 0; j < documentBuilders.length; j++) {
+                                assertTrue(XMLUtils.repoolDocumentBuilder(documentBuilders[j]));
+                            }
+                        }
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            });
+        }
+        // more or less mimic gc
+        results[nThreads - 1] = exec.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    final Field poolField = XMLUtils.class.getDeclaredField("pools");
+                    poolField.setAccessible(true);
+                    final WeakObjectPool[] weakObjectPools = (WeakObjectPool[]) poolField.get(null);
+
+                    final Field availableField = WeakObjectPool.class.getDeclaredField("available");
+                    availableField.setAccessible(true);
+
+                    while (true) {
+                        final BlockingDeque blockingDeque = (BlockingDeque) availableField.get(weakObjectPools[1]);
+                        Iterator iterator = blockingDeque.iterator();
+                        while (iterator.hasNext()) {
+                            ((WeakReference) iterator.next()).clear();
+                        }
+                        Thread.sleep(200);
+                    }
+                } catch (InterruptedException e) {
+                    return;
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        exec.shutdown();
+        exec.awaitTermination(5, TimeUnit.SECONDS);
+        for (Future<?> f : results) {
+            if (!f.isDone()) {
+                f.cancel(false);
+            }
+            try {
+                assertNull(f.get(1000, TimeUnit.MILLISECONDS));
+            } catch (CancellationException ce) {
+                //expected since we did cancel it
+            } catch (TimeoutException e) {
+                fail(f + "didn't cancel after timeout?");
+            }
+        }
+    }
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/RFC2253ParserTest.java b/src/test/java/org/apache/xml/security/test/dom/utils/RFC2253ParserTest.java
index 896133c..d031984 100644
--- a/src/test/java/org/apache/xml/security/test/dom/utils/RFC2253ParserTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/RFC2253ParserTest.java
@@ -19,93 +19,102 @@
 package org.apache.xml.security.test.dom.utils;
 
 import org.apache.xml.security.utils.RFC2253Parser;
+import org.junit.Assert;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  */
-public class RFC2253ParserTest {
+public class RFC2253ParserTest extends Assert {
 
     @Test
     public void testToXML1() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=\"Steve, Kille\",  O=Isode Limited, C=GB"), "CN=Steve\\, Kille,O=Isode Limited,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=\"Steve, Kille\",  O=Isode Limited, C=GB"), "CN=Steve\\, Kille,O=Isode Limited,C=GB");
     }
 
     @Test
     public void testToXML2() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=Steve Kille    ,   O=Isode Limited,C=GB"), "CN=Steve Kille,O=Isode Limited,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=Steve Kille    ,   O=Isode Limited,C=GB"), "CN=Steve Kille,O=Isode Limited,C=GB");
     }
 
     @Test
     public void testToXML3() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("\\ OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\ \\ "), "\\20OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\20\\20");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("\\ OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\ \\ "), "\\20OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\20\\20");
     }
 
     @Test
     public void testToXML4() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB"), "CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB"), "CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB");
     }
 
     @Test
     public void testToXML5() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=Before\\0DAfter,O=Test,C=GB"), "CN=Before\\0DAfter,O=Test,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=Before\\0DAfter,O=Test,C=GB"), "CN=Before\\0DAfter,O=Test,C=GB");
     }
 
     @Test
     public void testToXML6() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=\"L. Eagle,O=Sue, = + < > # ;Grabbit and Runn\",C=GB"), "CN=L. Eagle\\,O\\=Sue\\, \\= \\+ \\< \\> \\# \\;Grabbit and Runn,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("CN=\"L. Eagle,O=Sue, = + < > # ;Grabbit and Runn\",C=GB"), "CN=L. Eagle\\,O\\=Sue\\, \\= \\+ \\< \\> \\# \\;Grabbit and Runn,C=GB");
     }
 
     @Test
     public void testToXML7() throws Exception {
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB"), "1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB");
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB"), "1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB");
     }
 
     @Test
     public void testToXML8() throws Exception {
-        StringBuilder sb = new StringBuilder("Lu\uc48di\uc487");
-        assertEquals(RFC2253Parser.rfc2253toXMLdsig("SN=" + sb.toString()), "SN=Lu\uc48di\uc487");
+        StringBuilder sb = new StringBuilder();
+        sb.append('L');
+        sb.append('u');
+        sb.append('\uc48d');
+        sb.append('i');
+        sb.append('\uc487');
+        Assert.assertEquals(RFC2253Parser.rfc2253toXMLdsig("SN=" + sb.toString()), "SN=Lu\uc48di\uc487");
     }
 
     @Test
     public void testToRFC1() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=\"Steve, Kille\",  O=Isode Limited, C=GB"), "CN=Steve\\, Kille,O=Isode Limited,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=\"Steve, Kille\",  O=Isode Limited, C=GB"), "CN=Steve\\, Kille,O=Isode Limited,C=GB");
     }
 
     @Test
     public void testToRFC2() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=Steve Kille    ,   O=Isode Limited,C=GB"), "CN=Steve Kille,O=Isode Limited,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=Steve Kille    ,   O=Isode Limited,C=GB"), "CN=Steve Kille,O=Isode Limited,C=GB");
     }
 
     @Test
     public void testToRFC3() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("\\20OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\20\\20 "), "\\ OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\ \\ ");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("\\20OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\20\\20 "), "\\ OU=Sales+CN=J. Smith,O=Widget Inc.,C=US\\ \\ ");
     }
 
     @Test
     public void testToRFC4() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB"), "CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB"), "CN=L. Eagle,O=Sue\\, Grabbit and Runn,C=GB");
     }
 
     @Test
     public void testToRFC5() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=Before\\12After,O=Test,C=GB"), "CN=Before\\\u0012After,O=Test,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=Before\\12After,O=Test,C=GB"), "CN=Before\\\u0012After,O=Test,C=GB");
     }
 
     @Test
     public void testToRFC6() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=\"L. Eagle,O=Sue, = + < > # ;Grabbit and Runn\",C=GB"), "CN=L. Eagle\\,O\\=Sue\\, \\= \\+ \\< \\> \\# \\;Grabbit and Runn,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("CN=\"L. Eagle,O=Sue, = + < > # ;Grabbit and Runn\",C=GB"), "CN=L. Eagle\\,O\\=Sue\\, \\= \\+ \\< \\> \\# \\;Grabbit and Runn,C=GB");
     }
 
     @Test
     public void testToRFC7() throws Exception {
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("1.3.6.1.4.1.1466.0=\\#04024869,O=Test,C=GB"), "1.3.6.1.4.1.1466.0=\\#04024869,O=Test,C=GB");
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("1.3.6.1.4.1.1466.0=\\#04024869,O=Test,C=GB"), "1.3.6.1.4.1.1466.0=\\#04024869,O=Test,C=GB");
     }
 
     @Test
     public void testToRFC8() throws Exception {
-        StringBuilder sb = new StringBuilder("Lu\uc48di\uc487");
-        assertEquals(RFC2253Parser.xmldsigtoRFC2253("SN=" + sb.toString()), "SN=Lu\uc48di\uc487");
+        StringBuilder sb = new StringBuilder();
+        sb.append('L');
+        sb.append('u');
+        sb.append('\uc48d');
+        sb.append('i');
+        sb.append('\uc487');
+        Assert.assertEquals(RFC2253Parser.xmldsigtoRFC2253("SN=" + sb.toString()), "SN=Lu\uc48di\uc487");
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/XMLUtilsPerformanceTest.java b/src/test/java/org/apache/xml/security/test/dom/utils/XMLUtilsPerformanceTest.java
index 021d09e..62ccdcc 100644
--- a/src/test/java/org/apache/xml/security/test/dom/utils/XMLUtilsPerformanceTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/XMLUtilsPerformanceTest.java
@@ -20,9 +20,7 @@
 
 import java.io.StringReader;
 
-import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.apache.xml.security.utils.XMLUtils;
 import org.junit.Test;
@@ -38,22 +36,11 @@
 
     @BenchmarkOptions(callgc = false, benchmarkRounds = 100000, warmupRounds = 100)
     @Test
-    public void testXMLUtils() throws Exception {
-        InputSource inputSource = new InputSource(new StringReader("<xml>123</xml>"));
-        XMLUtils.read(inputSource, false);
-    }
-
-    @BenchmarkOptions(callgc = false, benchmarkRounds = 100000, warmupRounds = 100)
-    @Test
     public void testCreateDocumentBuilder() throws Exception {
-        DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
-        dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
-        dfactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-        dfactory.setNamespaceAware(true);
-        DocumentBuilder documentBuilder = dfactory.newDocumentBuilder();
-
         InputSource inputSource = new InputSource(new StringReader("<xml>123</xml>"));
-        documentBuilder.parse(inputSource);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        db.parse(inputSource);
+        XMLUtils.repoolDocumentBuilder(db);
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/OfflineResolver.java b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/OfflineResolver.java
index d31fb24..29afcd5 100644
--- a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/OfflineResolver.java
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/OfflineResolver.java
@@ -118,7 +118,7 @@
 
                 return result;
             } else {
-                Object[] exArgs = {"The URI " + URI + " is not configured for offline work" };
+                Object exArgs[] = {"The URI " + URI + " is not configured for offline work" };
 
                 throw new ResourceResolverException(
                     "generic.EmptyMessage", exArgs, context.uriToResolve, context.baseUri
@@ -139,14 +139,14 @@
     @Override
     public boolean engineCanResolveURI(ResourceResolverContext context) {
         String uriNodeValue = context.uriToResolve;
-        if (uriNodeValue.isEmpty() || uriNodeValue.charAt(0) == '#') {
+        if (uriNodeValue.equals("") || uriNodeValue.startsWith("#")) {
             return false;
         }
 
         URI uriNew = null;
         try {
             uriNew = getNewURI(context.uriToResolve, context.baseUri);
-            if ("http".equals(uriNew.getScheme())) {
+            if (uriNew.getScheme().equals("http")) {
                 LOG.debug("I state that I can resolve " + uriNew.toString());
                 return true;
             }
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResolverDirectHTTPTest.java b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResolverDirectHTTPTest.java
index 53bc03a..8ad6dd3 100644
--- a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResolverDirectHTTPTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResolverDirectHTTPTest.java
@@ -24,17 +24,14 @@
 import org.apache.xml.security.utils.resolver.ResourceResolverContext;
 import org.apache.xml.security.utils.resolver.ResourceResolverException;
 import org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-
-public class ResolverDirectHTTPTest {
+public class ResolverDirectHTTPTest extends Assert {
 
     //change these properties to match your environment
     private static final String url = "http://www.apache.org";
@@ -52,7 +49,7 @@
 
     @Test
     public void testBug40783() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("id");
         uri.setNodeValue("urn:ddd:uuu");
         doc.createElement("test").setAttributeNode(uri);
@@ -67,7 +64,7 @@
     @Test
     @Ignore
     public void testProxyAuth() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("URI");
         uri.setNodeValue(url);
 
@@ -84,7 +81,7 @@
     @Test
     @Ignore
     public void testProxyAuthWithWrongPassword() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("URI");
         uri.setNodeValue(url);
 
@@ -97,16 +94,16 @@
             new ResourceResolverContext(uri, url, true);
         try {
             resolverDirectHTTP.engineResolveURI(context);
-            fail("Expected ResourceResolverException");
+            Assert.fail("Expected ResourceResolverException");
         } catch (ResourceResolverException e) {
-            assertEquals("Server returned HTTP response code: 407 for URL: " + url, e.getMessage());
+            Assert.assertEquals("Server returned HTTP response code: 407 for URL: " + url, e.getMessage());
         }
     }
 
     @Test
     @Ignore
     public void testServerAuth() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("URI");
         uri.setNodeValue(url);
 
@@ -121,7 +118,7 @@
     @Test
     @Ignore
     public void testServerAuthWithWrongPassword() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("URI");
         uri.setNodeValue(url);
 
@@ -132,16 +129,16 @@
             new ResourceResolverContext(uri, url, true);
         try {
             resolverDirectHTTP.engineResolveURI(context);
-            fail("Expected ResourceResolverException");
+            Assert.fail("Expected ResourceResolverException");
         } catch (ResourceResolverException e) {
-            assertEquals("Server returned HTTP response code: 401 for URL: " + url, e.getMessage());
+            Assert.assertEquals("Server returned HTTP response code: 401 for URL: " + url, e.getMessage());
         }
     }
 
     @Test
     @Ignore
     public void testProxyAndServerAuth() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uri = doc.createAttribute("URI");
         uri.setNodeValue(url);
 
diff --git a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResourceResolverTest.java b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResourceResolverTest.java
index 355de19..0315ada 100644
--- a/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResourceResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/utils/resolver/ResourceResolverTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.dom.utils.resolver;
 
+import static org.junit.Assert.fail;
 
 import java.io.File;
 
@@ -26,8 +27,6 @@
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.fail;
-
 /**
  * Unit test for {@link org.apache.xml.security.utils.resolver.ResourceResolver}
  *
@@ -50,7 +49,7 @@
         String className =
             "org.apache.xml.security.test.dom.utils.resolver.OfflineResolver";
         ResourceResolver.registerAtStart(className);
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uriAttr = doc.createAttribute("URI");
         uriAttr.setValue("http://www.apache.org");
         ResourceResolver res =
@@ -59,6 +58,7 @@
             uriAttr.setValue("http://xmldsig.pothole.com/xml-stylesheet.txt");
             res.resolve(uriAttr, null, true);
         } catch (Exception e) {
+            e.printStackTrace();
             fail(uriAttr.getValue()
                 + " should be resolvable by the OfflineResolver");
         }
@@ -73,7 +73,7 @@
 
     @org.junit.Test
     public void testLocalFileWithEmptyBaseURI() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Attr uriAttr = doc.createAttribute("URI");
         String basedir = System.getProperty("basedir");
         String file = new File(basedir, "pom.xml").toURI().toString();
@@ -86,4 +86,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/dom/version/VersionTest.java b/src/test/java/org/apache/xml/security/test/dom/version/VersionTest.java
index 3e45c70..a98f192 100644
--- a/src/test/java/org/apache/xml/security/test/dom/version/VersionTest.java
+++ b/src/test/java/org/apache/xml/security/test/dom/version/VersionTest.java
@@ -18,14 +18,11 @@
  */
 package org.apache.xml.security.test.dom.version;
 
+import static org.junit.Assert.assertTrue;
 
 import java.security.Provider;
 import java.security.Security;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * Version test.
  */
@@ -38,13 +35,13 @@
     @org.junit.Test
     public void testConvertVersion() throws Exception {
         String version = convertVersion("1.4.4");
-        assertEquals("1.44", version);
+        assertTrue("1.44".equals(version));
 
         version = convertVersion("1.4.4-SNAPSHOT");
-        assertEquals("1.44", version);
+        assertTrue("1.44".equals(version));
 
         version = convertVersion("1.4");
-        assertEquals("1.4", version);
+        assertTrue("1.4".equals(version));
     }
 
     @org.junit.Test
@@ -52,10 +49,10 @@
         Security.addProvider(new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI());
 
         Provider provider = Security.getProvider("ApacheXMLDSig");
-        assertNotNull(provider);
+        assertTrue(provider != null);
 
         String version = System.getProperty("product.version");
-        assertNotNull(version);
+        assertTrue(version != null);
 
         version = convertVersion(version);
 
@@ -89,4 +86,4 @@
         return version;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/IVSplittingOutputStreamTest.java b/src/test/java/org/apache/xml/security/test/stax/IVSplittingOutputStreamTest.java
index 7aa4795..2c69ee7 100644
--- a/src/test/java/org/apache/xml/security/test/stax/IVSplittingOutputStreamTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/IVSplittingOutputStreamTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.stax;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.xml.security.stax.impl.util.IVSplittingOutputStream;
@@ -28,15 +29,11 @@
 import javax.crypto.SecretKey;
 import java.io.ByteArrayOutputStream;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 /**
  */
-public class IVSplittingOutputStreamTest {
+public class IVSplittingOutputStreamTest extends Assert {
 
-    private static final String TEST_STR
-        = "Within this class we test if the IVSplittingOutputStream works correctly under different conditions";
+    private final String testString = "Within this class we test if the IVSplittingOutputStream works correctly under different conditions";
 
     @Test
     public void testWriteBytes() throws Exception {
@@ -52,16 +49,16 @@
         IVSplittingOutputStream ivSplittingOutputStream = new IVSplittingOutputStream(byteArrayOutputStream, cipher, secretKey, ivSize);
         ReplaceableOuputStream replaceableOuputStream = new ReplaceableOuputStream(ivSplittingOutputStream);
         ivSplittingOutputStream.setParentOutputStream(replaceableOuputStream);
-        byte[] testBytes = TEST_STR.getBytes();
+        byte[] testBytes = testString.getBytes();
         for (int i = 0; i < testBytes.length; i++) {
             replaceableOuputStream.write(testBytes[i]);
         }
         replaceableOuputStream.close();
 
-        assertEquals(new String(ivSplittingOutputStream.getIv()), TEST_STR.substring(0, ivSize));
-        assertEquals(new String(byteArrayOutputStream.toByteArray()), TEST_STR.substring(ivSize));
-        assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), TEST_STR);
-        assertTrue(ivSplittingOutputStream.isIVComplete());
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()), testString.substring(0, ivSize));
+        Assert.assertEquals(new String(byteArrayOutputStream.toByteArray()), testString.substring(ivSize));
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), testString);
+        Assert.assertTrue(ivSplittingOutputStream.isIVComplete());
     }
 
     @Test
@@ -78,13 +75,13 @@
         IVSplittingOutputStream ivSplittingOutputStream = new IVSplittingOutputStream(byteArrayOutputStream, cipher, secretKey, ivSize);
         ReplaceableOuputStream replaceableOuputStream = new ReplaceableOuputStream(ivSplittingOutputStream);
         ivSplittingOutputStream.setParentOutputStream(replaceableOuputStream);
-        replaceableOuputStream.write(TEST_STR.getBytes());
+        replaceableOuputStream.write(testString.getBytes());
         replaceableOuputStream.close();
 
-        assertEquals(new String(ivSplittingOutputStream.getIv()), TEST_STR.substring(0, ivSize));
-        assertEquals(new String(byteArrayOutputStream.toByteArray()), TEST_STR.substring(ivSize));
-        assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), TEST_STR);
-        assertTrue(ivSplittingOutputStream.isIVComplete());
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()), testString.substring(0, ivSize));
+        Assert.assertEquals(new String(byteArrayOutputStream.toByteArray()), testString.substring(ivSize));
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), testString);
+        Assert.assertTrue(ivSplittingOutputStream.isIVComplete());
     }
 
     @Test
@@ -102,7 +99,7 @@
         ReplaceableOuputStream replaceableOuputStream = new ReplaceableOuputStream(ivSplittingOutputStream);
         ivSplittingOutputStream.setParentOutputStream(replaceableOuputStream);
 
-        byte[] testBytes = TEST_STR.getBytes();
+        byte[] testBytes = testString.getBytes();
         for (int i = 0; i < testBytes.length - ivSize; i += ivSize) {
             replaceableOuputStream.write(testBytes, i, ivSize);
         }
@@ -110,10 +107,10 @@
         replaceableOuputStream.write(testBytes, testBytes.length - testBytes.length % ivSize, testBytes.length % ivSize);
         replaceableOuputStream.close();
 
-        assertEquals(new String(ivSplittingOutputStream.getIv()), TEST_STR.substring(0, ivSize));
-        assertEquals(new String(byteArrayOutputStream.toByteArray()), TEST_STR.substring(ivSize));
-        assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), TEST_STR);
-        assertTrue(ivSplittingOutputStream.isIVComplete());
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()), testString.substring(0, ivSize));
+        Assert.assertEquals(new String(byteArrayOutputStream.toByteArray()), testString.substring(ivSize));
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), testString);
+        Assert.assertTrue(ivSplittingOutputStream.isIVComplete());
     }
 
     @Test
@@ -131,16 +128,16 @@
         ReplaceableOuputStream replaceableOuputStream = new ReplaceableOuputStream(ivSplittingOutputStream);
         ivSplittingOutputStream.setParentOutputStream(replaceableOuputStream);
 
-        byte[] testBytes = TEST_STR.getBytes();
+        byte[] testBytes = testString.getBytes();
         replaceableOuputStream.write(testBytes, 0, testBytes.length - ivSize);
         //write last part
         replaceableOuputStream.write(testBytes, testBytes.length - ivSize, ivSize);
         replaceableOuputStream.close();
 
-        assertEquals(new String(ivSplittingOutputStream.getIv()), TEST_STR.substring(0, ivSize));
-        assertEquals(new String(byteArrayOutputStream.toByteArray()), TEST_STR.substring(ivSize));
-        assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), TEST_STR);
-        assertTrue(ivSplittingOutputStream.isIVComplete());
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()), testString.substring(0, ivSize));
+        Assert.assertEquals(new String(byteArrayOutputStream.toByteArray()), testString.substring(ivSize));
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), testString);
+        Assert.assertTrue(ivSplittingOutputStream.isIVComplete());
     }
 
     @Test
@@ -158,7 +155,7 @@
         ReplaceableOuputStream replaceableOuputStream = new ReplaceableOuputStream(ivSplittingOutputStream);
         ivSplittingOutputStream.setParentOutputStream(replaceableOuputStream);
 
-        byte[] testBytes = TEST_STR.getBytes();
+        byte[] testBytes = testString.getBytes();
         for (int i = 0; i < testBytes.length - 4; i += 4) {
             replaceableOuputStream.write(testBytes, i, 4);
         }
@@ -166,9 +163,9 @@
         replaceableOuputStream.write(testBytes, testBytes.length - testBytes.length % 4, testBytes.length % 4);
         replaceableOuputStream.close();
 
-        assertEquals(new String(ivSplittingOutputStream.getIv()), TEST_STR.substring(0, ivSize));
-        assertEquals(new String(byteArrayOutputStream.toByteArray()), TEST_STR.substring(ivSize));
-        assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), TEST_STR);
-        assertTrue(ivSplittingOutputStream.isIVComplete());
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()), testString.substring(0, ivSize));
+        Assert.assertEquals(new String(byteArrayOutputStream.toByteArray()), testString.substring(ivSize));
+        Assert.assertEquals(new String(ivSplittingOutputStream.getIv()) + new String(byteArrayOutputStream.toByteArray()), testString);
+        Assert.assertTrue(ivSplittingOutputStream.isIVComplete());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/InputProcessorChainTest.java b/src/test/java/org/apache/xml/security/test/stax/InputProcessorChainTest.java
index c9fd61e..dbf663f 100644
--- a/src/test/java/org/apache/xml/security/test/stax/InputProcessorChainTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/InputProcessorChainTest.java
@@ -21,6 +21,7 @@
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.stax.config.Init;
 import org.apache.xml.security.stax.impl.InboundSecurityContextImpl;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -34,11 +35,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  */
-public class InputProcessorChainTest {
+public class InputProcessorChainTest extends Assert {
 
     @Before
     public void setUp() throws Exception {
@@ -112,9 +111,9 @@
         };
         inputProcessorChain.addProcessor(inputProcessor3);
 
-        assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor3);
-        assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor2);
-        assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor1);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor3);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor2);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor1);
     }
 
     @Test
@@ -149,12 +148,12 @@
         };
         inputProcessorChain.addProcessor(inputProcessor6);
 
-        assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
-        assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor3);
-        assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
-        assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor1);
-        assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor5);
-        assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor2);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor3);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor1);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor5);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor2);
     }
 
     @Test
@@ -192,12 +191,12 @@
         inputProcessor6.addBeforeProcessor(inputProcessor1.getClass().getName());
         inputProcessorChain.addProcessor(inputProcessor6);
 
-        assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor3);
-        assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor4);
-        assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor1);
-        assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor6);
-        assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor2);
-        assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor5);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor3);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor4);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor1);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor6);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor2);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor5);
     }
 
     @Test
@@ -235,12 +234,12 @@
         inputProcessor6.addAfterProcessor(inputProcessor1.getClass().getName());
         inputProcessorChain.addProcessor(inputProcessor6);
 
-        assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
-        assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor3);
-        assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
-        assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor1);
-        assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor5);
-        assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor2);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor3);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor1);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor5);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor2);
     }
 
     @Test
@@ -275,11 +274,11 @@
         inputProcessor6.addAfterProcessor("");
         inputProcessorChain.addProcessor(inputProcessor6);
 
-        assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
-        assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor5);
-        assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
-        assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor3);
-        assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor2);
-        assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor1);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(0), inputProcessor4);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(1), inputProcessor5);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(2), inputProcessor6);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(3), inputProcessor3);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(4), inputProcessor2);
+        Assert.assertEquals(inputProcessorChain.getProcessors().get(5), inputProcessor1);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/OutputProcessorChainTest.java b/src/test/java/org/apache/xml/security/test/stax/OutputProcessorChainTest.java
index 6a87db8..f5469d6 100644
--- a/src/test/java/org/apache/xml/security/test/stax/OutputProcessorChainTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/OutputProcessorChainTest.java
@@ -18,29 +18,24 @@
  */
 package org.apache.xml.security.test.stax;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.xml.stream.XMLStreamException;
-
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.stax.config.Init;
-import org.apache.xml.security.stax.ext.OutputProcessor;
-import org.apache.xml.security.stax.ext.OutputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.impl.OutboundSecurityContextImpl;
-import org.apache.xml.security.stax.impl.OutputProcessorChainImpl;
-
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.impl.OutputProcessorChainImpl;
+
+import javax.xml.stream.XMLStreamException;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  */
-public class OutputProcessorChainTest {
+public class OutputProcessorChainTest extends Assert {
 
     @Before
     public void setUp() throws Exception {
@@ -120,9 +115,9 @@
         };
         outputProcessorChain.addProcessor(outputProcessor3);
 
-        assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor1);
-        assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
-        assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor3);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor1);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor3);
     }
 
     @Test
@@ -157,12 +152,12 @@
         };
         outputProcessorChain.addProcessor(outputProcessor6);
 
-        assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor2);
-        assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor5);
-        assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor1);
-        assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
-        assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor3);
-        assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor2);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor5);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor1);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor3);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
     }
 
     @Test
@@ -200,12 +195,12 @@
         outputProcessor6.addBeforeProcessor(outputProcessor1.getClass().getName());
         outputProcessorChain.addProcessor(outputProcessor6);
 
-        assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor5);
-        assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
-        assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor6);
-        assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor1);
-        assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor4);
-        assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor3);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor5);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor6);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor1);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor4);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor3);
     }
 
     @Test
@@ -243,12 +238,12 @@
         outputProcessor6.addAfterProcessor(outputProcessor1.getClass().getName());
         outputProcessorChain.addProcessor(outputProcessor6);
 
-        assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor2);
-        assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor5);
-        assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor1);
-        assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
-        assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor3);
-        assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor2);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor5);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor1);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor3);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
     }
 
     @Test
@@ -283,11 +278,11 @@
         outputProcessor6.addAfterProcessor("");
         outputProcessorChain.addProcessor(outputProcessor6);
 
-        assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor1);
-        assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
-        assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor3);
-        assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
-        assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor5);
-        assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(0), outputProcessor1);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(1), outputProcessor2);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(2), outputProcessor3);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(3), outputProcessor6);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(4), outputProcessor5);
+        Assert.assertEquals(outputProcessorChain.getProcessors().get(5), outputProcessor4);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/TrimmerOutputStreamTest.java b/src/test/java/org/apache/xml/security/test/stax/TrimmerOutputStreamTest.java
index be6da51..445439e 100644
--- a/src/test/java/org/apache/xml/security/test/stax/TrimmerOutputStreamTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/TrimmerOutputStreamTest.java
@@ -18,34 +18,32 @@
  */
 package org.apache.xml.security.test.stax;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.xml.security.stax.impl.util.TrimmerOutputStream;
 
 import java.io.ByteArrayOutputStream;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  */
-public class TrimmerOutputStreamTest {
+public class TrimmerOutputStreamTest extends Assert {
 
-    private static final String TEST_STR
-        = "Within this class we test if the TrimmerOutputStream works correctly under different conditions";
+    private final String testString = "Within this class we test if the TrimmerOutputStream works correctly under different conditions";
 
     @Test
     public void testWriteSingleBytes() throws Exception {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         TrimmerOutputStream trimmerOutputStream = new TrimmerOutputStream(baos, 32, 3, 4);
 
-        byte[] TEST_STRBytes = ("<a>" + TEST_STR + "</a>").getBytes();
-        for (int i = 0; i < TEST_STRBytes.length; i++) {
-            trimmerOutputStream.write(TEST_STRBytes[i]);
+        byte[] testStringBytes = ("<a>" + testString + "</a>").getBytes();
+        for (int i = 0; i < testStringBytes.length; i++) {
+            trimmerOutputStream.write(testStringBytes[i]);
         }
         trimmerOutputStream.close();
 
-        assertEquals(baos.size(), TEST_STRBytes.length - 7);
-        assertEquals(baos.toString(), TEST_STR);
+        Assert.assertEquals(baos.size(), testStringBytes.length - 7);
+        Assert.assertEquals(baos.toString(), testString);
     }
 
     @Test
@@ -55,25 +53,25 @@
 
         StringBuilder stringBuffer = new StringBuilder("<a>");
         for (int i = 0; i < 100; i++) {
-            stringBuffer.append(TEST_STR);
+            stringBuffer.append(testString);
         }
         stringBuffer.append("</a>");
 
-        byte[] TEST_STRBytes = stringBuffer.toString().getBytes();
+        byte[] testStringBytes = stringBuffer.toString().getBytes();
 
         int written = 0;
         int count = 0;
         do {
             count++;
-            trimmerOutputStream.write(TEST_STRBytes, written, count);
+            trimmerOutputStream.write(testStringBytes, written, count);
             written += count;
         }
-        while ((written + count + 1) < TEST_STRBytes.length);
+        while ((written + count + 1) < testStringBytes.length);
 
-        trimmerOutputStream.write(TEST_STRBytes, written, TEST_STRBytes.length - written);
+        trimmerOutputStream.write(testStringBytes, written, testStringBytes.length - written);
         trimmerOutputStream.close();
 
-        assertEquals(baos.size(), TEST_STRBytes.length - 7);
-        assertEquals(baos.toString(), stringBuffer.toString().substring(3, stringBuffer.length() - 4));
+        Assert.assertEquals(baos.size(), testStringBytes.length - 7);
+        Assert.assertEquals(baos.toString(), stringBuffer.toString().substring(3, stringBuffer.length() - 4));
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/UncategorizedTest.java b/src/test/java/org/apache/xml/security/test/stax/UncategorizedTest.java
index 1243239..e5c9cd2 100644
--- a/src/test/java/org/apache/xml/security/test/stax/UncategorizedTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/UncategorizedTest.java
@@ -19,6 +19,7 @@
 package org.apache.xml.security.test.stax;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.junit.Assert;
 import org.junit.Test;
 import org.apache.xml.security.stax.config.Init;
 import org.apache.xml.security.stax.ext.XMLSec;
@@ -30,30 +31,27 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 /**
  */
-public class UncategorizedTest {
+public class UncategorizedTest extends Assert {
 
     @Test
     public void testConfigurationLoadFromUrl() throws Exception {
         URL url =
             this.getClass().getClassLoader().getResource(
-                "org/apache/xml/security/c14n/in/32_input.xml");
+                "org/apache/xml/security/c14n/in/31_input.xml");
         try {
             Init.init(url.toURI(), this.getClass());
-            fail();
+            Assert.fail();
         } catch (XMLSecurityException e) {
-            assertTrue(e.getMessage().contains("Cannot find the declaration of element 'doc'."));
+            Assert.assertTrue(e.getMessage().contains("Cannot find the declaration of element 'doc'."));
         }
     }
 
     @Test
     public void testDuplicateActions() throws Exception {
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -66,9 +64,9 @@
 
         try {
             XMLSec.getOutboundXMLSec(properties);
-            fail();
+            Assert.fail();
         } catch (XMLSecurityConfigurationException ex) {
-            assertTrue(ex.getMessage().contains("Duplicate Actions are not allowed"));
+            Assert.assertTrue(ex.getMessage().contains("Duplicate Actions are not allowed"));
         }
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/XMLSecEventTest.java b/src/test/java/org/apache/xml/security/test/stax/XMLSecEventTest.java
index c8737a3..622aadb 100644
--- a/src/test/java/org/apache/xml/security/test/stax/XMLSecEventTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/XMLSecEventTest.java
@@ -18,73 +18,56 @@
  */
 package org.apache.xml.security.test.stax;
 
-import java.io.StringWriter;
-import java.util.ArrayDeque;
-import java.util.Deque;
+import org.apache.xml.security.stax.ext.stax.*;
+import org.apache.xml.security.stax.impl.XMLSecurityEventReader;
+import org.apache.xml.security.stax.impl.stax.*;
+import org.junit.Assert;
+import org.junit.Test;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.events.XMLEvent;
-
-import org.apache.xml.security.stax.ext.stax.XMLSecAttribute;
-import org.apache.xml.security.stax.ext.stax.XMLSecCharacters;
-import org.apache.xml.security.stax.ext.stax.XMLSecComment;
-import org.apache.xml.security.stax.ext.stax.XMLSecEntityDeclaration;
-import org.apache.xml.security.stax.ext.stax.XMLSecEntityReference;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.ext.stax.XMLSecNamespace;
-import org.apache.xml.security.stax.ext.stax.XMLSecProcessingInstruction;
-import org.apache.xml.security.stax.impl.XMLSecurityEventReader;
-import org.apache.xml.security.stax.impl.stax.XMLSecAttributeImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecCharactersImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecCommentImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEntityDeclarationImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecEntityReferenceImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecNamespaceImpl;
-import org.apache.xml.security.stax.impl.stax.XMLSecProcessingInstructionImpl;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
+import java.io.StringWriter;
+import java.util.ArrayDeque;
+import java.util.Deque;
 
 /**
  */
-public class XMLSecEventTest {
+public class XMLSecEventTest extends Assert {
 
     @Test
     public void testWriteCharactersEncoded() throws Exception {
         StringWriter stringWriter = new StringWriter();
         XMLSecCharacters xmlSecCharacters = new XMLSecCharactersImpl("test", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals("test", stringWriter.toString());
+        Assert.assertEquals("test", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecCharacters = new XMLSecCharactersImpl("<", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals("&lt;", stringWriter.toString());
+        Assert.assertEquals("&lt;", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecCharacters = new XMLSecCharactersImpl(">", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals("&gt;", stringWriter.toString());
+        Assert.assertEquals("&gt;", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecCharacters = new XMLSecCharactersImpl("&", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals("&amp;", stringWriter.toString());
+        Assert.assertEquals("&amp;", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecCharacters = new XMLSecCharactersImpl("<&>", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals("&lt;&amp;&gt;", stringWriter.toString());
+        Assert.assertEquals("&lt;&amp;&gt;", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecCharacters = new XMLSecCharactersImpl(" < & > ", false, false, false, null);
         xmlSecCharacters.writeAsEncodedUnicode(stringWriter);
-        assertEquals(" &lt; &amp; &gt; ", stringWriter.toString());
+        Assert.assertEquals(" &lt; &amp; &gt; ", stringWriter.toString());
     }
 
     @Test
@@ -92,22 +75,22 @@
         StringWriter stringWriter = new StringWriter();
         XMLSecAttribute xmlSecAttribute = new XMLSecAttributeImpl(new QName("test", "test", "test"), "test");
         xmlSecAttribute.writeAsEncodedUnicode(stringWriter);
-        assertEquals("test:test=\"test\"", stringWriter.toString());
+        Assert.assertEquals("test:test=\"test\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecAttribute = new XMLSecAttributeImpl(new QName("test"), "\"");
         xmlSecAttribute.writeAsEncodedUnicode(stringWriter);
-        assertEquals("test=\"&quot;\"", stringWriter.toString());
+        Assert.assertEquals("test=\"&quot;\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecAttribute = new XMLSecAttributeImpl(new QName("test"), "&");
         xmlSecAttribute.writeAsEncodedUnicode(stringWriter);
-        assertEquals("test=\"&amp;\"", stringWriter.toString());
+        Assert.assertEquals("test=\"&amp;\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecAttribute = new XMLSecAttributeImpl(new QName("test"), " & \" > < ");
         xmlSecAttribute.writeAsEncodedUnicode(stringWriter);
-        assertEquals("test=\" &amp; &quot; > < \"", stringWriter.toString());
+        Assert.assertEquals("test=\" &amp; &quot; > < \"", stringWriter.toString());
     }
 
     @Test
@@ -115,7 +98,7 @@
         StringWriter stringWriter = new StringWriter();
         XMLSecComment xmlSecAttribute = new XMLSecCommentImpl(" < > & \" '", null);
         xmlSecAttribute.writeAsEncodedUnicode(stringWriter);
-        assertEquals("<!-- < > & \" '-->", stringWriter.toString());
+        Assert.assertEquals("<!-- < > & \" '-->", stringWriter.toString());
     }
 
     @Test
@@ -123,7 +106,7 @@
         StringWriter stringWriter = new StringWriter();
         XMLSecEntityDeclaration xmlSecEntityDeclaration = new XMLSecEntityDeclarationImpl("test");
         xmlSecEntityDeclaration.writeAsEncodedUnicode(stringWriter);
-        assertEquals("<!ENTITY test \"\">", stringWriter.toString());
+        Assert.assertEquals("<!ENTITY test \"\">", stringWriter.toString());
     }
 
     @Test
@@ -131,7 +114,7 @@
         StringWriter stringWriter = new StringWriter();
         XMLSecEntityReference xmlSecEntityReference = new XMLSecEntityReferenceImpl("test", null, null);
         xmlSecEntityReference.writeAsEncodedUnicode(stringWriter);
-        assertEquals("&test;", stringWriter.toString());
+        Assert.assertEquals("&test;", stringWriter.toString());
     }
 
     @Test
@@ -139,22 +122,22 @@
         StringWriter stringWriter = new StringWriter();
         XMLSecNamespace xmlSecNamespace = XMLSecNamespaceImpl.getInstance("test", "test");
         xmlSecNamespace.writeAsEncodedUnicode(stringWriter);
-        assertEquals("xmlns:test=\"test\"", stringWriter.toString());
+        Assert.assertEquals("xmlns:test=\"test\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecNamespace = XMLSecNamespaceImpl.getInstance("", "\"");
         xmlSecNamespace.writeAsEncodedUnicode(stringWriter);
-        assertEquals("xmlns=\"&quot;\"", stringWriter.toString());
+        Assert.assertEquals("xmlns=\"&quot;\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecNamespace = XMLSecNamespaceImpl.getInstance("test", "&");
         xmlSecNamespace.writeAsEncodedUnicode(stringWriter);
-        assertEquals("xmlns:test=\"&amp;\"", stringWriter.toString());
+        Assert.assertEquals("xmlns:test=\"&amp;\"", stringWriter.toString());
 
         stringWriter = new StringWriter();
         xmlSecNamespace = XMLSecNamespaceImpl.getInstance("test", " & \" > < ");
         xmlSecNamespace.writeAsEncodedUnicode(stringWriter);
-        assertEquals("xmlns:test=\" &amp; &quot; > < \"", stringWriter.toString());
+        Assert.assertEquals("xmlns:test=\" &amp; &quot; > < \"", stringWriter.toString());
     }
 
     @Test
@@ -163,7 +146,7 @@
         XMLSecProcessingInstruction xmlSecProcessingInstruction =
                 new XMLSecProcessingInstructionImpl("test", "test", null);
         xmlSecProcessingInstruction.writeAsEncodedUnicode(stringWriter);
-        assertEquals("<?test test?>", stringWriter.toString());
+        Assert.assertEquals("<?test test?>", stringWriter.toString());
     }
 
     @Test
@@ -173,7 +156,7 @@
                 xmlInputFactory.createXMLStreamReader(this.getClass().getClassLoader().getResourceAsStream(
                         "org/apache/xml/security/c14n/inExcl/plain-soap-1.1.xml"));
 
-        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<>();
+        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<XMLSecEvent>();
         do {
             xmlSecEventDeque.push(XMLSecEventFactory.allocate(xmlStreamReader, null));
             xmlStreamReader.next();
@@ -197,6 +180,6 @@
             secXmlEvent.writeAsEncodedUnicode(secWriter);
         }
 
-        assertEquals(secWriter.toString(), stdWriter.toString());
+        Assert.assertEquals(secWriter.toString(), stdWriter.toString());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventReaderTest.java b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventReaderTest.java
index a43d105..0945919 100644
--- a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventReaderTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventReaderTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.test.stax;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
@@ -31,13 +32,9 @@
 import java.util.ArrayDeque;
 import java.util.Deque;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
 /**
  */
-public class XMLSecurityEventReaderTest {
+public class XMLSecurityEventReaderTest extends Assert {
 
     @Test
     public void testConformness() throws Exception {
@@ -46,7 +43,7 @@
             xmlInputFactory.createXMLStreamReader(this.getClass().getClassLoader().getResourceAsStream(
                 "org/apache/xml/security/c14n/inExcl/plain-soap-1.1.xml"));
 
-        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<>();
+        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<XMLSecEvent>();
         do {
             xmlSecEventDeque.push(XMLSecEventFactory.allocate(xmlStreamReader, null));
             xmlStreamReader.next();
@@ -60,22 +57,22 @@
             xmlInputFactory.createXMLEventReader(this.getClass().getClassLoader().getResourceAsStream(
                 "org/apache/xml/security/c14n/inExcl/plain-soap-1.1.xml"));
         while (xmlEventReader.hasNext()) {
-            assertEquals(xmlEventReader.hasNext(), xmlSecurityEventReader.hasNext());
+            Assert.assertEquals(xmlEventReader.hasNext(), xmlSecurityEventReader.hasNext());
             XMLEvent stdXmlEvent = xmlEventReader.nextEvent();
             XMLEvent secXmlEvent = xmlSecurityEventReader.nextEvent();
-            assertEquals(stdXmlEvent.getEventType(), secXmlEvent.getEventType());
+            Assert.assertEquals(stdXmlEvent.getEventType(), secXmlEvent.getEventType());
 
             XMLEvent stdPeekedXMLEvent = xmlEventReader.peek();
             XMLEvent secPeekedXMLEvent = xmlSecurityEventReader.peek();
             if (stdPeekedXMLEvent == null) {
-                assertNull(secPeekedXMLEvent);
+                Assert.assertNull(secPeekedXMLEvent);
             } else {
-                assertEquals(stdPeekedXMLEvent.getEventType(), secPeekedXMLEvent.getEventType());
+                Assert.assertEquals(stdPeekedXMLEvent.getEventType(), secPeekedXMLEvent.getEventType());
             }
         }
 
-        assertFalse(xmlEventReader.hasNext());
-        assertFalse(xmlSecurityEventReader.hasNext());
+        Assert.assertFalse(xmlEventReader.hasNext());
+        Assert.assertFalse(xmlSecurityEventReader.hasNext());
     }
 
     @Test
@@ -85,7 +82,7 @@
             xmlInputFactory.createXMLStreamReader(this.getClass().getClassLoader().getResourceAsStream(
                 "org/apache/xml/security/c14n/inExcl/plain-soap-1.1.xml"));
 
-        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<>();
+        Deque<XMLSecEvent> xmlSecEventDeque = new ArrayDeque<XMLSecEvent>();
         do {
             xmlSecEventDeque.push(XMLSecEventFactory.allocate(xmlStreamReader, null));
             xmlStreamReader.next();
@@ -109,18 +106,18 @@
             }
 
             XMLEvent secXmlEvent = xmlSecurityEventReader.nextEvent();
-            assertEquals(stdXmlEvent.getEventType(), secXmlEvent.getEventType());
+            Assert.assertEquals(stdXmlEvent.getEventType(), secXmlEvent.getEventType());
 
             XMLEvent stdPeekedXMLEvent = xmlEventReader.peek();
             XMLEvent secPeekedXMLEvent = xmlSecurityEventReader.peek();
             if (stdPeekedXMLEvent == null) {
-                assertNull(secPeekedXMLEvent);
+                Assert.assertNull(secPeekedXMLEvent);
             } else {
-                assertEquals(stdPeekedXMLEvent.getEventType(), secPeekedXMLEvent.getEventType());
+                Assert.assertEquals(stdPeekedXMLEvent.getEventType(), secPeekedXMLEvent.getEventType());
             }
         }
 
-        assertFalse(xmlEventReader.hasNext());
-        assertFalse(xmlSecurityEventReader.hasNext());
+        Assert.assertFalse(xmlEventReader.hasNext());
+        Assert.assertFalse(xmlSecurityEventReader.hasNext());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventWriterTest.java b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventWriterTest.java
index 5025d50..497ab3c 100644
--- a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventWriterTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityEventWriterTest.java
@@ -23,6 +23,7 @@
 import org.apache.xml.security.stax.impl.stax.XMLSecEndElementImpl;
 import org.apache.xml.security.stax.impl.stax.XMLSecNamespaceImpl;
 import org.apache.xml.security.stax.impl.stax.XMLSecStartElementImpl;
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.custommonkey.xmlunit.XMLAssert;
@@ -33,11 +34,9 @@
 import javax.xml.stream.events.XMLEvent;
 import java.io.StringWriter;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  */
-public class XMLSecurityEventWriterTest {
+public class XMLSecurityEventWriterTest extends Assert {
 
     @Test
     public void testConformness() throws Exception {
@@ -80,7 +79,7 @@
         xmlEventWriter.add(new XMLSecStartElementImpl(new QName("http://ns3", "c", ""), null, null));
         xmlEventWriter.close();
 
-        assertEquals(
+        Assert.assertEquals(
                 "<ns1:a xmlns:ns1=\"http://ns1\">" +
                         "<b xmlns=\"http://ns2\"/>" +
                         "<c xmlns=\"http://ns3\">" +
@@ -88,4 +87,4 @@
                         "</ns1:a>",
                 stringWriter.toString());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamReaderTest.java b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamReaderTest.java
index 3f2c9b7..2c27061 100644
--- a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamReaderTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamReaderTest.java
@@ -18,13 +18,20 @@
  */
 package org.apache.xml.security.test.stax;
 
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-import java.util.HashSet;
-import java.util.Set;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.Init;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.custommonkey.xmlunit.XMLAssert;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
+import org.apache.xml.security.stax.impl.DocumentContextImpl;
+import org.apache.xml.security.stax.impl.InputProcessorChainImpl;
+import org.apache.xml.security.stax.impl.InboundSecurityContextImpl;
+import org.apache.xml.security.stax.impl.XMLSecurityStreamReader;
 
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
@@ -33,32 +40,17 @@
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.stax.StAXSource;
 import javax.xml.transform.stream.StreamResult;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.Init;
-import org.apache.xml.security.stax.ext.InputProcessor;
-import org.apache.xml.security.stax.ext.InputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.ext.stax.XMLSecEventFactory;
-import org.apache.xml.security.stax.impl.DocumentContextImpl;
-import org.apache.xml.security.stax.impl.InboundSecurityContextImpl;
-import org.apache.xml.security.stax.impl.InputProcessorChainImpl;
-import org.apache.xml.security.stax.impl.XMLSecurityStreamReader;
-
-import org.custommonkey.xmlunit.XMLAssert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  */
-public class XMLSecurityStreamReaderTest {
+public class XMLSecurityStreamReaderTest extends Assert {
 
     @Before
     public void setUp() throws Exception {
@@ -75,7 +67,7 @@
         inputProcessorChain.addProcessor(new EventReaderProcessor());
         XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
         int event = xmlSecurityStreamReader.next();
-        assertEquals(XMLStreamConstants.START_DOCUMENT, event);
+        Assert.assertEquals(XMLStreamConstants.START_DOCUMENT, event);
     }
 
     @Test
@@ -87,7 +79,7 @@
         inputProcessorChain.addProcessor(new EventReaderProcessor());
         XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
         int event = xmlSecurityStreamReader.next();
-        assertEquals(XMLStreamConstants.START_ELEMENT, event);
+        Assert.assertEquals(XMLStreamConstants.START_ELEMENT, event);
     }
 
     @Test
@@ -128,128 +120,128 @@
         do {
             switch (stdXMLEventType) {
                 case XMLStreamConstants.START_ELEMENT:
-                    assertTrue(xmlSecurityStreamReader.isStartElement());
-                    assertFalse(xmlSecurityStreamReader.isEndElement());
-                    assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
-                    assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
-                    assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
+                    Assert.assertTrue(xmlSecurityStreamReader.isStartElement());
+                    Assert.assertFalse(xmlSecurityStreamReader.isEndElement());
+                    Assert.assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
+                    Assert.assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
                     if (stdXmlStreamReader.getPrefix() == null) {
-                        assertEquals("", xmlSecurityStreamReader.getPrefix());
+                        Assert.assertEquals("", xmlSecurityStreamReader.getPrefix());
                     } else {
-                        assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
+                        Assert.assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
                     }
-                    assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
-                    assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
-                    assertEquals(stdXmlStreamReader.getAttributeCount(), xmlSecurityStreamReader.getAttributeCount());
-                    assertEquals(stdXmlStreamReader.getNamespaceCount(), xmlSecurityStreamReader.getNamespaceCount());
+                    Assert.assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
+                    Assert.assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
+                    Assert.assertEquals(stdXmlStreamReader.getAttributeCount(), xmlSecurityStreamReader.getAttributeCount());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceCount(), xmlSecurityStreamReader.getNamespaceCount());
                     for (int i = 0; i < stdXmlStreamReader.getAttributeCount(); i++) {
-                        assertEquals(stdXmlStreamReader.getAttributeLocalName(i), xmlSecurityStreamReader.getAttributeLocalName(i));
-                        assertEquals(stdXmlStreamReader.getAttributeName(i), xmlSecurityStreamReader.getAttributeName(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeLocalName(i), xmlSecurityStreamReader.getAttributeLocalName(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeName(i), xmlSecurityStreamReader.getAttributeName(i));
                         if (stdXmlStreamReader.getAttributeNamespace(i) == null) {
-                            assertEquals("", xmlSecurityStreamReader.getAttributeNamespace(i));
+                            Assert.assertEquals("", xmlSecurityStreamReader.getAttributeNamespace(i));
                         } else {
-                            assertEquals(stdXmlStreamReader.getAttributeNamespace(i), xmlSecurityStreamReader.getAttributeNamespace(i));
+                            Assert.assertEquals(stdXmlStreamReader.getAttributeNamespace(i), xmlSecurityStreamReader.getAttributeNamespace(i));
                         }
                         if (stdXmlStreamReader.getAttributePrefix(i) == null) {
-                            assertEquals("", xmlSecurityStreamReader.getAttributePrefix(i));
+                            Assert.assertEquals("", xmlSecurityStreamReader.getAttributePrefix(i));
                         } else {
-                            assertEquals(stdXmlStreamReader.getAttributePrefix(i), xmlSecurityStreamReader.getAttributePrefix(i));
+                            Assert.assertEquals(stdXmlStreamReader.getAttributePrefix(i), xmlSecurityStreamReader.getAttributePrefix(i));
                         }
-                        assertEquals(stdXmlStreamReader.getAttributeType(i), xmlSecurityStreamReader.getAttributeType(i));
-                        assertEquals(stdXmlStreamReader.getAttributeValue(i), xmlSecurityStreamReader.getAttributeValue(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeType(i), xmlSecurityStreamReader.getAttributeType(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeValue(i), xmlSecurityStreamReader.getAttributeValue(i));
                     }
                     for (int i = 0; i < stdXmlStreamReader.getNamespaceCount(); i++) {
                         if (stdXmlStreamReader.getNamespacePrefix(i) == null) {
-                            assertEquals("", xmlSecurityStreamReader.getNamespacePrefix(i));
+                            Assert.assertEquals("", xmlSecurityStreamReader.getNamespacePrefix(i));
                         } else {
-                            assertEquals(stdXmlStreamReader.getNamespacePrefix(i), xmlSecurityStreamReader.getNamespacePrefix(i));
+                            Assert.assertEquals(stdXmlStreamReader.getNamespacePrefix(i), xmlSecurityStreamReader.getNamespacePrefix(i));
                         }
-                        assertEquals(stdXmlStreamReader.getNamespaceURI(i), xmlSecurityStreamReader.getNamespaceURI(i));
+                        Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(i), xmlSecurityStreamReader.getNamespaceURI(i));
                     }
                     break;
                 case XMLStreamConstants.END_ELEMENT:
-                    assertFalse(xmlSecurityStreamReader.isStartElement());
-                    assertTrue(xmlSecurityStreamReader.isEndElement());
-                    assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
-                    assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
-                    assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
+                    Assert.assertFalse(xmlSecurityStreamReader.isStartElement());
+                    Assert.assertTrue(xmlSecurityStreamReader.isEndElement());
+                    Assert.assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
+                    Assert.assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
                     if (stdXmlStreamReader.getPrefix() == null) {
-                        assertEquals("", xmlSecurityStreamReader.getPrefix());
+                        Assert.assertEquals("", xmlSecurityStreamReader.getPrefix());
                     } else {
-                        assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
+                        Assert.assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
                     }
-                    assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
-                    assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
+                    Assert.assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
+                    Assert.assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
                     break;
                 case XMLStreamConstants.PROCESSING_INSTRUCTION:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
-                    assertEquals(stdXmlStreamReader.getPITarget(), xmlSecurityStreamReader.getPITarget());
-                    assertEquals(stdXmlStreamReader.getPIData(), xmlSecurityStreamReader.getPIData());
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.getPITarget(), xmlSecurityStreamReader.getPITarget());
+                    Assert.assertEquals(stdXmlStreamReader.getPIData(), xmlSecurityStreamReader.getPIData());
                     break;
                 case XMLStreamConstants.CHARACTERS:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
-                    assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
-                    assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
-                    assertEquals(
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
                             new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
                             new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
-                    assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
                     break;
                 case XMLStreamConstants.COMMENT:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
-                    assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
-                    assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
-                    assertEquals(
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
                             new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
                             new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
-                    assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
                     break;
                 case XMLStreamConstants.SPACE:
-                    assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
-                    assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
-                    assertEquals(
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
                             new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
                             new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
-                    assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
                     break;
                 case XMLStreamConstants.START_DOCUMENT:
-                    assertEquals(stdXmlStreamReader.getCharacterEncodingScheme(), xmlSecurityStreamReader.getCharacterEncodingScheme());
-                    assertEquals(stdXmlStreamReader.getEncoding(), xmlSecurityStreamReader.getEncoding());
-                    //assertEquals(stdXmlStreamReader.getVersion(), xmlSecurityStreamReader.getVersion());
+                    Assert.assertEquals(stdXmlStreamReader.getCharacterEncodingScheme(), xmlSecurityStreamReader.getCharacterEncodingScheme());
+                    Assert.assertEquals(stdXmlStreamReader.getEncoding(), xmlSecurityStreamReader.getEncoding());
+                    //Assert.assertEquals(stdXmlStreamReader.getVersion(), xmlSecurityStreamReader.getVersion());
                     break;
                 case XMLStreamConstants.END_DOCUMENT:
                     break;
                 case XMLStreamConstants.ENTITY_REFERENCE:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
-                    assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
                     break;
                 case XMLStreamConstants.ATTRIBUTE:
                     break;
                 case XMLStreamConstants.DTD:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
                     break;
                 case XMLStreamConstants.CDATA:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
                     break;
                 case XMLStreamConstants.NAMESPACE:
                     break;
                 case XMLStreamConstants.NOTATION_DECLARATION:
                     break;
                 case XMLStreamConstants.ENTITY_DECLARATION:
-                    assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
                     break;
             }
             //hmm2 an eventreader returns a CHARACTER EVENT for an ignorable whitespace whereby a streamReader returns it as SPACE
             if (stdXMLEventType == XMLStreamConstants.SPACE && secXMLEventType == XMLStreamConstants.CHARACTERS) {
                 secXMLEventType = XMLStreamConstants.SPACE;
             }
-            assertEquals(stdXMLEventType, secXMLEventType);
+            Assert.assertEquals(stdXMLEventType, secXMLEventType);
             if (stdXmlStreamReader.hasNext()) {
-                assertTrue(xmlSecurityStreamReader.hasNext());
+                Assert.assertTrue(xmlSecurityStreamReader.hasNext());
                 stdXMLEventType = stdXmlStreamReader.next();
                 secXMLEventType = xmlSecurityStreamReader.next();
             } else {
-                assertFalse(xmlSecurityStreamReader.hasNext());
+                Assert.assertFalse(xmlSecurityStreamReader.hasNext());
                 break;
             }
         } while (true);
diff --git a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamWriterTest.java b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamWriterTest.java
index e064d8e..c427366 100644
--- a/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamWriterTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/XMLSecurityStreamWriterTest.java
@@ -18,41 +18,32 @@
  */
 package org.apache.xml.security.test.stax;
 
-import java.io.StringWriter;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.stax.config.Init;
+import org.apache.xml.security.stax.impl.OutboundSecurityContextImpl;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.custommonkey.xmlunit.XMLAssert;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
+import org.apache.xml.security.stax.impl.OutputProcessorChainImpl;
+import org.apache.xml.security.stax.impl.XMLSecurityStreamWriter;
 
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLEventWriter;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.stax.config.Init;
-import org.apache.xml.security.stax.ext.OutputProcessor;
-import org.apache.xml.security.stax.ext.OutputProcessorChain;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
-import org.apache.xml.security.stax.impl.OutboundSecurityContextImpl;
-import org.apache.xml.security.stax.impl.OutputProcessorChainImpl;
-import org.apache.xml.security.stax.impl.XMLSecurityStreamWriter;
-
-import org.custommonkey.xmlunit.XMLAssert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
 
 /**
  */
-public class XMLSecurityStreamWriterTest {
+public class XMLSecurityStreamWriterTest extends Assert {
 
     @Before
     public void setUp() throws Exception {
@@ -184,7 +175,7 @@
         xmlSecurityStreamWriter.writeProcessingInstruction("PI", "there");
         stdXmlStreamWriter.writeProcessingInstruction("PI", "there");
 
-        assertEquals(xmlSecurityStreamWriter.getPrefix("test4ns"), stdXmlStreamWriter.getPrefix("test4ns"));
+        Assert.assertEquals(xmlSecurityStreamWriter.getPrefix("test4ns"), stdXmlStreamWriter.getPrefix("test4ns"));
 
         stdXmlStreamWriter.close();
         xmlSecurityStreamWriter.close();
diff --git a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer11Test.java b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer11Test.java
index 0714995..28f5522 100644
--- a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer11Test.java
+++ b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer11Test.java
@@ -32,6 +32,7 @@
 import javax.xml.stream.XMLResolver;
 import javax.xml.stream.XMLStreamException;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -39,12 +40,6 @@
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  */
 public class Canonicalizer11Test {
@@ -332,10 +327,47 @@
             c14nAndCompare(fileIn, fileIn, true);
             fail();
         } catch (XMLStreamException cex) {
-            assertNotNull(cex);
+            assertTrue(cex != null);
         }
     }
 
+//   /**
+//    * The XPath data model represents data using UCS characters.
+//    * Implementations MUST use XML processors that support UTF-8 and UTF-16
+//    * and translate to the UCS character domain. For UTF-16, the leading byte
+//    * order mark is treated as an artifact of encoding and stripped from the
+//    * UCS character data (subsequent zero width non-breaking spaces appearing
+//    * within the UTF-16 data are not removed) [UTF-16, Section 3.2]. Support
+//    * for ISO-8859-1 encoding is RECOMMENDED, and all other character encodings
+//    * are OPTIONAL.
+//    *
+//    * $todo$ implement the test
+//    * @throws CanonicalizationException
+//    * @throws java.io.FileNotFoundException
+//    * @throws java.io.IOException
+//    * @throws InvalidCanonicalizerException
+//    * @throws javax.xml.parsers.ParserConfigurationException
+//    * @throws org.xml.sax.SAXException
+//    * @throws javax.xml.transform.TransformerException
+//    */
+//   public static void testTranslationFromUTF16toUTF8() throws Exception {
+//
+//      String val =
+//         "<UTF16>The german &amp;auml (which is Unicode &amp;#xE4;):  &quot;&#xE4;&quot;</UTF16>";
+//      byte utf16[] = convertToUTF16(val.getBytes());
+//      Canonicalizer c14n =
+//         Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
+//      byte c14nBytes[] = c14n.canonicalize(utf16);
+//      org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+//      InputStream refStream = resolver.resolveEntity(
+//         null,
+//            prefix + "/in/testTranslationFromUTF16toUTF8.xml")
+//               .getByteStream();
+//      byte refBytes[] = JavaUtils.getBytesFromStream(refStream);
+//      boolean equal = java.security.MessageDigest.isEqual(refBytes, c14nBytes);
+//
+//      assertTrue("Parser does not translate to UCS character domain", equal);
+//   }
 //
 //   /**
 //    * Method testXMLAttributes1
@@ -563,7 +595,7 @@
 //      db.setErrorHandler(new org.apache.xml.security.utils
 //         .IgnoreAllErrorHandler());
 //
-//      Document doc = XMLUtils.read(new ByteArrayInputStream(input.getBytes()));
+//      Document doc = db.parse(new ByteArrayInputStream(input.getBytes()));
 //      Canonicalizer c14nizer =
 //         Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
 //      CachedXPathAPI xpathAPI = new CachedXPathAPI();
@@ -572,8 +604,8 @@
 //
 //      NodeList nodes =
 //         xpathAPI.selectNodeList(doc, "(//*[local-name()='included'] | //@*[parent::node()[local-name()='included']])");
-//      byte[] result = c14nizer.canonicalizeXPathNodeSet(nodes);
-//      byte[] defined = definedOutput.getBytes();
+//      byte result[] = c14nizer.canonicalizeXPathNodeSet(nodes);
+//      byte defined[] = definedOutput.getBytes();
 //      assertEquals(definedOutput, new String(result));
 //      return java.security.MessageDigest.isEqual(defined, result);
 //   }
@@ -602,8 +634,8 @@
         }
 
         // org.xml.sax.InputSource refIs = resolver.resolveEntity(null, fileRef);
-        // byte[] refBytes = JavaUtils.getBytesFromStream(refIs.getByteStream());
-        byte[] refBytes = getBytesFromResource(fileRef);
+        // byte refBytes[] = JavaUtils.getBytesFromStream(refIs.getByteStream());
+        byte refBytes[] = getBytesFromResource(fileRef);
 
         // if everything is OK, result is true; we do a binary compare, byte by byte
         boolean result = java.security.MessageDigest.isEqual(refBytes, baos.toByteArray());
@@ -619,7 +651,7 @@
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         InputStream inputStream = resource.openStream();
         try {
-            byte[] buf = new byte[1024];
+            byte buf[] = new byte[1024];
             int len;
             while ((len = inputStream.read(buf)) > 0) {
                 baos.write(buf, 0, len);
@@ -643,14 +675,14 @@
 //    * @throws javax.xml.transform.TransformerConfigurationException
 //    * @throws javax.xml.transform.TransformerException
 //    */
-//   public static byte[] convertToUTF16(byte[] input) throws Exception {
+//   public static byte[] convertToUTF16(byte input[]) throws Exception {
 //
 //      //String ENCODING_ISO8859_1 = "ISO-8859-1";
 //      //String ENCODING_UTF8 = java.nio.charset.StandardCharsets.UTF_8;
 //      String ENCODING_UTF16 = "UTF-16";
 //      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 //      DocumentBuilder db = dbf.newDocumentBuilder();
-//      Document doc = XMLUtils.read(new ByteArrayInputStream(input));
+//      Document doc = db.parse(new ByteArrayInputStream(input));
 //      TransformerFactory tFactory = TransformerFactory.newInstance();
 //      Transformer transformer = tFactory.newTransformer();
 //
@@ -665,4 +697,4 @@
 //
 //      return os.toByteArray();
 //   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315ExclusiveTest.java b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315ExclusiveTest.java
index 25d901f..95686de 100644
--- a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315ExclusiveTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315ExclusiveTest.java
@@ -37,6 +37,7 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import static org.junit.Assert.*;
 
 import java.io.*;
 import java.net.URL;
@@ -45,10 +46,6 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-
 /**
  */
 public class Canonicalizer20010315ExclusiveTest {
@@ -236,7 +233,7 @@
      */
     @org.junit.Test
     public void test24Aexcl() throws Exception {
-        Document doc = XMLUtils.newDocument();
+        Document doc = XMLUtils.createDocumentBuilder(false).newDocument();
         Element local = doc.createElementNS("foo:bar", "dsig:local");
         Element test = doc.createElementNS("http://example.net", "etsi:test");
         Element elem2 = doc.createElementNS("http://example.net", "etsi:elem2");
@@ -781,7 +778,7 @@
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         InputStream inputStream = resource.openStream();
         try {
-            byte[] buf = new byte[1024];
+            byte buf[] = new byte[1024];
             int len;
             while ((len = inputStream.read(buf)) > 0) {
                 baos.write(buf, 0, len);
diff --git a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315Test.java b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315Test.java
index cd811b6..f54d27a 100644
--- a/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315Test.java
+++ b/src/test/java/org/apache/xml/security/test/stax/c14n/Canonicalizer20010315Test.java
@@ -33,6 +33,7 @@
 import javax.xml.stream.XMLResolver;
 import javax.xml.stream.XMLStreamException;
 
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -40,12 +41,6 @@
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  */
 public class Canonicalizer20010315Test {
@@ -367,7 +362,7 @@
             c14nAndCompare(fileIn, fileIn, true);
             fail();
         } catch (XMLStreamException cex) {
-            assertNotNull(cex);
+            assertTrue(cex != null);
         }
     }
 
@@ -436,12 +431,16 @@
 //
 //      String val =
 //         "<UTF16>The german &amp;auml (which is Unicode &amp;#xE4;):  &quot;&#xE4;&quot;</UTF16>";
-//      byte[] utf16 = convertToUTF16(val.getBytes());
+//      byte utf16[] = convertToUTF16(val.getBytes());
 //      Canonicalizer c14n =
 //         Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
-//      byte[] c14nBytes = c14n.canonicalize(utf16);
-//      InputStream refStream = new FileInputStream(prefix + "/in/testTranslationFromUTF16toUTF8.xml");
-//      byte[] refBytes = JavaUtils.getBytesFromStream(refStream);
+//      byte c14nBytes[] = c14n.canonicalize(utf16);
+//      org.xml.sax.EntityResolver resolver = new TestVectorResolver();
+//      InputStream refStream = resolver.resolveEntity(
+//         null,
+//            prefix + "/in/testTranslationFromUTF16toUTF8.xml")
+//               .getByteStream();
+//      byte refBytes[] = JavaUtils.getBytesFromStream(refStream);
 //      boolean equal = java.security.MessageDigest.isEqual(refBytes, c14nBytes);
 //
 //      assertTrue("Parser does not translate to UCS character domain", equal);
@@ -673,7 +672,7 @@
 //      db.setErrorHandler(new org.apache.xml.security.utils
 //         .IgnoreAllErrorHandler());
 //
-//      Document doc = XMLUtils.read(new ByteArrayInputStream(input.getBytes()));
+//      Document doc = db.parse(new ByteArrayInputStream(input.getBytes()));
 //      Canonicalizer c14nizer =
 //         Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
 //      CachedXPathAPI xpathAPI = new CachedXPathAPI();
@@ -682,8 +681,8 @@
 //
 //      NodeList nodes =
 //         xpathAPI.selectNodeList(doc, "(//*[local-name()='included'] | //@*[parent::node()[local-name()='included']])");
-//      byte[] result = c14nizer.canonicalizeXPathNodeSet(nodes);
-//      byte[] defined = definedOutput.getBytes();
+//      byte result[] = c14nizer.canonicalizeXPathNodeSet(nodes);
+//      byte defined[] = definedOutput.getBytes();
 //      assertEquals(definedOutput, new String(result));
 //      return java.security.MessageDigest.isEqual(defined, result);
 //   }
@@ -711,8 +710,8 @@
         }
 
         // org.xml.sax.InputSource refIs = resolver.resolveEntity(null, fileRef);
-        // byte[] refBytes = JavaUtils.getBytesFromStream(refIs.getByteStream());
-        byte[] refBytes = getBytesFromResource(fileRef);
+        // byte refBytes[] = JavaUtils.getBytesFromStream(refIs.getByteStream());
+        byte refBytes[] = getBytesFromResource(fileRef);
 
         // if everything is OK, result is true; we do a binary compare, byte by byte
         boolean result = java.security.MessageDigest.isEqual(refBytes, baos.toByteArray());
@@ -734,7 +733,7 @@
             inputStream = new UnixInputStream(inputStream);
         }
         try {
-            byte[] buf = new byte[1024];
+            byte buf[] = new byte[1024];
             int len;
             while ((len = inputStream.read(buf)) > 0) {
                 baos.write(buf, 0, len);
@@ -758,14 +757,14 @@
 //    * @throws javax.xml.transform.TransformerConfigurationException
 //    * @throws javax.xml.transform.TransformerException
 //    */
-//   public static byte[] convertToUTF16(byte[] input) throws Exception {
+//   public static byte[] convertToUTF16(byte input[]) throws Exception {
 //
 //      //String ENCODING_ISO8859_1 = "ISO-8859-1";
 //      //String ENCODING_UTF8 = StandardCharsets.UTF_8;
 //      String ENCODING_UTF16 = "UTF-16";
 //      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 //      DocumentBuilder db = dbf.newDocumentBuilder();
-//      Document doc = XMLUtils.read(new ByteArrayInputStream(input));
+//      Document doc = db.parse(new ByteArrayInputStream(input));
 //      TransformerFactory tFactory = TransformerFactory.newInstance();
 //      Transformer transformer = tFactory.newTransformer();
 //
@@ -780,4 +779,4 @@
 //
 //      return os.toByteArray();
 //   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/c14n/ExclusiveC14NInteropTest.java b/src/test/java/org/apache/xml/security/test/stax/c14n/ExclusiveC14NInteropTest.java
index 04417d5..21f0ab0 100644
--- a/src/test/java/org/apache/xml/security/test/stax/c14n/ExclusiveC14NInteropTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/c14n/ExclusiveC14NInteropTest.java
@@ -30,6 +30,7 @@
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.KeySpec;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -81,7 +82,8 @@
         // Read in plaintext document
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream("interop/c14n/Y1/exc-signature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         Key publicKey = getPublicKey();
@@ -105,7 +107,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     private static PublicKey getPublicKey()
diff --git a/src/test/java/org/apache/xml/security/test/stax/c14n/Santuario191Test.java b/src/test/java/org/apache/xml/security/test/stax/c14n/Santuario191Test.java
index 05e7719..2ce686d 100644
--- a/src/test/java/org/apache/xml/security/test/stax/c14n/Santuario191Test.java
+++ b/src/test/java/org/apache/xml/security/test/stax/c14n/Santuario191Test.java
@@ -29,12 +29,11 @@
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLInputFactory;
 
+import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayOutputStream;
 import java.io.StringReader;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * This is a test for Santuario-191:
  * <p></p>
@@ -98,4 +97,4 @@
         assertEquals(new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8), EXPECTED_RESULT);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/BaltimoreEncTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/BaltimoreEncTest.java
index d206a3c..89376e6 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/BaltimoreEncTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/BaltimoreEncTest.java
@@ -31,6 +31,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -55,10 +56,8 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-
 /**
  * Interop test for XML Encryption
  *
@@ -87,7 +86,8 @@
         }
         File f = new File(filename);
 
-        Document doc = XMLUtils.read(new java.io.FileInputStream(f), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(new java.io.FileInputStream(f));
 
         cardNumber = retrieveCCNumber(doc);
 
@@ -114,7 +114,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-content-tripledes-cbc.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnopqrstuvwx".getBytes(StandardCharsets.US_ASCII);
@@ -140,7 +141,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         checkDecryptedDoc(document, true);
     }
@@ -151,7 +152,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-content-aes256-cbc-prop.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnopqrstuvwxyz012345".getBytes(StandardCharsets.US_ASCII);
@@ -177,7 +179,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         checkDecryptedDoc(document, true);
     }
@@ -188,7 +190,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-content-aes128-cbc-kw-aes192.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnopqrstuvwx".getBytes(StandardCharsets.US_ASCII);
@@ -214,7 +217,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         checkDecryptedDoc(document, true);
     }
@@ -225,7 +228,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-element-tripledes-cbc-kw-aes128.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnop".getBytes(StandardCharsets.US_ASCII);
@@ -251,7 +255,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         checkDecryptedDoc(document, true);
     }
@@ -262,7 +266,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-element-aes128-cbc-rsa-1_5.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -284,7 +289,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         checkDecryptedDoc(document, true);
     }
@@ -295,7 +300,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-data-aes128-cbc.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnop".getBytes(StandardCharsets.US_ASCII);
@@ -321,7 +327,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -330,7 +336,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-data-aes256-cbc-kw-tripledes.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnopqrstuvwx".getBytes(StandardCharsets.US_ASCII);
@@ -356,7 +363,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -365,7 +372,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-data-aes192-cbc-kw-aes256.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] keyBytes = "abcdefghijklmnopqrstuvwxyz012345".getBytes(StandardCharsets.US_ASCII);
@@ -391,7 +399,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -400,7 +408,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/encrypt-data-tripledes-cbc-rsa-oaep-mgf1p.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -422,7 +431,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     /*
@@ -432,7 +441,7 @@
     private void checkDecryptedDoc(Document d, boolean doNodeCheck) throws Exception {
 
         String cc = retrieveCCNumber(d);
-        assertEquals(cardNumber, cc);
+        assertTrue(cc, cc != null && cc.equals(cardNumber));
 
         // Test cc numbers
         if (doNodeCheck) {
@@ -499,4 +508,4 @@
         return count;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/DecryptionTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/DecryptionTest.java
index 7a58232..073688a 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/DecryptionTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/DecryptionTest.java
@@ -37,6 +37,7 @@
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.DESedeKeySpec;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -70,23 +71,16 @@
 import org.apache.xml.security.test.stax.utils.StAX2DOM;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.*;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * A set of test-cases for Decryption.
  *
  */
-public class DecryptionTest {
+public class DecryptionTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
     private TransformerFactory transformerFactory = TransformerFactory.newInstance();
@@ -105,7 +99,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -120,7 +115,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -139,11 +134,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -160,7 +155,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -175,7 +171,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -197,11 +193,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -217,7 +213,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -234,7 +231,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -256,11 +253,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -276,7 +273,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -292,7 +290,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -314,15 +312,15 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the ShippingAddress decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "ShippingAddress");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkMultipleEncryptedElementSecurityEvents(securityEventListener);
@@ -342,7 +340,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] bits192 = "abcdefghijklmnopqrstuvwx".getBytes();
@@ -363,7 +362,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -385,11 +384,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -411,7 +410,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyPairGenerator rsaKeygen = KeyPairGenerator.getInstance("RSA");
@@ -434,7 +434,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -456,11 +456,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -478,7 +478,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyPairGenerator rsaKeygen = KeyPairGenerator.getInstance("RSA");
@@ -501,7 +502,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -523,11 +524,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -549,7 +550,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] bits192 = "abcdefghijklmnopqrstuvwx".getBytes();
@@ -572,7 +574,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -594,11 +596,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -616,7 +618,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] passPhrase = "24 Bytes per DESede key!".getBytes();
@@ -634,7 +637,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -656,11 +659,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -676,7 +679,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] bits128 = {
@@ -696,7 +700,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -718,11 +722,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -738,7 +742,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] bits192 = {
@@ -760,7 +765,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -782,11 +787,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -802,7 +807,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] bits256 = {
@@ -826,7 +832,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -848,11 +854,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -870,7 +876,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] passPhrase = "24 Bytes per DESede key!".getBytes();
@@ -888,7 +895,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -910,11 +917,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptionToken(securityEventListener, null, secretKey,
@@ -927,9 +934,10 @@
     public void testPhysicalRepresentation() throws Exception {
         final String DATA1 =
                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns:root xmlns:ns=\"ns.com\"><ns:elem xmlns:ns2=\"ns2.com\">11</ns:elem></ns:root>";
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(DATA1.getBytes(StandardCharsets.UTF_8))) {
-            document = XMLUtils.read(is, false);
+            document = db.parse(is);
         }
 
         // Set up the Key
@@ -948,7 +956,7 @@
 
         // Check the element encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("ns.com", "elem");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -969,11 +977,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the element decrypted ok
         nodeList = document.getElementsByTagNameNS("ns.com", "elem");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         Element decrElem = (Element)document.getDocumentElement().getFirstChild();
         assertEquals("ns:elem", decrElem.getNodeName());
@@ -994,9 +1002,10 @@
     public void testPhysicalRepresentation2() throws Exception {
         final String DATA1 =
                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns:root xmlns=\"defns.com\" xmlns:ns=\"ns.com\"><elem xmlns=\"\">11</elem></ns:root>";
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(DATA1.getBytes(StandardCharsets.UTF_8))) {
-            document = XMLUtils.read(is, false);
+            document = db.parse(is);
         }
 
         // Set up the Key
@@ -1015,7 +1024,7 @@
 
         // Check the element encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("", "elem");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1036,11 +1045,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the element decrypted ok
         nodeList = document.getElementsByTagNameNS("", "elem");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         Element decrElem = (Element)document.getDocumentElement().getFirstChild();
         assertEquals("elem", decrElem.getNodeName());
@@ -1153,7 +1162,7 @@
             String expression = "//*[local-name()='" + localName + "']";
             Element elementToEncrypt =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(elementToEncrypt);
+            Assert.assertNotNull(elementToEncrypt);
 
             document = cipher.doFinal(document, elementToEncrypt, content);
         }
@@ -1162,7 +1171,7 @@
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertTrue(nodeList.getLength() > 0);
+        Assert.assertTrue(nodeList.getLength() > 0);
     }
 
     protected void checkEncryptedElementSecurityEvents(TestSecurityEventListener securityEventListener) {
@@ -1263,7 +1272,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         for (int i = 0; i < 7; i++) {
             NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
@@ -1300,7 +1310,7 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Exception expected");
         } catch (XMLStreamException e) {
             assertTrue(e.getCause() instanceof XMLSecurityException);
@@ -1315,7 +1325,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyPairGenerator rsaKeygen = KeyPairGenerator.getInstance("RSA");
@@ -1338,13 +1349,13 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         NodeList cipherValues = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_CipherValue.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_CipherValue.getLocalPart());
         Element cipherValueElement = (Element)cipherValues.item(0);
-        assertEquals(
+        Assert.assertEquals(
                 cipherValueElement.getParentNode().getParentNode().getLocalName(),
                 XMLSecurityConstants.TAG_xenc_EncryptedKey.getLocalPart());
 
@@ -1381,9 +1392,9 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } catch (XMLStreamException e) {
-            assertFalse(e.getMessage().contains("Unwrapping failed"));
+            Assert.assertFalse(e.getMessage().contains("Unwrapping failed"));
         }
     }
 
@@ -1393,7 +1404,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1420,7 +1432,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1441,11 +1453,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1454,7 +1466,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1491,7 +1504,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1512,11 +1525,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1525,7 +1538,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1561,7 +1575,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1583,11 +1597,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1596,7 +1610,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1632,7 +1647,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1654,11 +1669,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1675,7 +1690,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1711,7 +1727,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1733,11 +1749,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1746,7 +1762,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -1773,7 +1790,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1795,11 +1812,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -1808,7 +1825,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -1823,7 +1841,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1846,13 +1864,13 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // XMLUtils.outputDOM(document, System.out);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedElementSecurityEvents(securityEventListener);
@@ -1869,7 +1887,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -1884,7 +1903,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1907,11 +1926,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         checkEncryptedContentSecurityEvents(securityEventListener);
@@ -1927,7 +1946,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         SecretKey secretKey = generateSecretKey();
@@ -1942,7 +1962,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PurchaseOrder");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1965,11 +1985,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "PurchaseOrder");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the SecurityEvents
         EncryptedElementSecurityEvent encryptedElementEvent =
@@ -1983,4 +2003,4 @@
         checkEncryptionMethod(
                 securityEventListener, "http://www.w3.org/2001/04/xmlenc#tripledes-cbc", null);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/EncryptionCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/EncryptionCreationTest.java
index bc70543..9b9217c 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/EncryptionCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/EncryptionCreationTest.java
@@ -54,6 +54,7 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Attr;
@@ -61,17 +62,11 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * A set of test-cases for Encryption.
  *
  */
-public class EncryptionCreationTest {
+public class EncryptionCreationTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
 
@@ -87,7 +82,7 @@
     public void testEncryptionContentCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -116,21 +111,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -138,14 +133,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptRootElementInRequest() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -175,18 +170,18 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -194,14 +189,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testExceptionOnElementToEncryptNotFound() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -226,10 +221,10 @@
         try {
             XmlReaderToWriter.writeAll(xmlStreamReader, xmlStreamWriter);
             xmlStreamWriter.close();
-            fail("Exception expected");
+            Assert.fail("Exception expected");
         } catch (XMLStreamException e) {
-            assertTrue(e.getCause() instanceof XMLSecurityException);
-            assertEquals("Part to encrypt not found: {urn:example:po}NotExistingElement", e.getCause().getMessage());
+            Assert.assertTrue(e.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("Part to encrypt not found: {urn:example:po}NotExistingElement", e.getCause().getMessage());
         }
     }
 
@@ -237,7 +232,7 @@
     public void testEncryptionElementCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -266,21 +261,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -288,14 +283,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testStrongEncryption() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -325,21 +320,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -347,14 +342,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptionMultipleElements() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -386,21 +381,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 2);
+        Assert.assertEquals(nodeList.getLength(), 2);
     }
 
     // Test encryption using a generated AES 128 bit key that is encrypted using a AES 192 bit key.
@@ -408,7 +403,7 @@
     public void testAES128ElementAES192KWCipherUsingKEKOutbound() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -444,21 +439,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -466,7 +461,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     // Test encryption using a generated AES 256 bit key that is encrypted using an RSA key.
@@ -474,7 +469,7 @@
     public void testAES256ElementRSAKWCipherUsingKEKOutbound() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -513,21 +508,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -535,14 +530,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyKeyValueReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -582,21 +577,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -604,14 +599,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyKeyNameReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -652,21 +647,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
         );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -674,14 +669,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyMultipleElements() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -724,18 +719,18 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 2);
+        Assert.assertEquals(nodeList.getLength(), 2);
 
         // Decrypt using DOM API
         decryptUsingDOM("http://www.w3.org/2001/04/xmlenc#tripledes-cbc", null, priv, document);
@@ -745,7 +740,7 @@
     public void testEncryptedKeyIssuerSerialReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -787,21 +782,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -809,14 +804,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyX509CertificateReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -858,21 +853,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -880,7 +875,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -895,7 +890,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -937,21 +932,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -959,14 +954,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyX509SubjectName() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1008,21 +1003,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1030,14 +1025,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testEncryptedKeyNoKeyInfo() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1079,21 +1074,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1101,7 +1096,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     // Test encryption using a generated AES 192 bit key that is encrypted using a 3DES key.
@@ -1109,7 +1104,7 @@
     public void testAES192Element3DESKWCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1144,21 +1139,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1166,14 +1161,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testTripleDesElementCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1205,21 +1200,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1227,14 +1222,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAes128ElementCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1268,21 +1263,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1290,14 +1285,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAes192ElementCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1333,21 +1328,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1355,14 +1350,14 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAes256ElementCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1399,20 +1394,20 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
 
         Document document =
-            XMLUtils.read(new ByteArrayInputStream(baos.toByteArray()), false);
+            XMLUtils.createDocumentBuilder(false).parse(new ByteArrayInputStream(baos.toByteArray()));
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1420,7 +1415,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     // Test case for when the entire document is encrypted and decrypted
@@ -1429,7 +1424,7 @@
     public void testTripleDesDocumentCipher() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1461,21 +1456,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1483,7 +1478,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     // Test physical representation of decrypted element, see SANTUARIO-309
@@ -1491,7 +1486,7 @@
     public void testPhysicalRepresentation1() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1524,17 +1519,17 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("ns.com", "elem");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1554,7 +1549,7 @@
     public void testPhysicalRepresentation2() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1587,17 +1582,17 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("", "elem");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1616,7 +1611,7 @@
     public void testTransportKey() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -1647,21 +1642,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc =
@@ -1669,7 +1664,7 @@
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     /**
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionCreationTest.java
index 350708f..6c1e59d 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionCreationTest.java
@@ -50,18 +50,17 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * A test to make sure that the various KeyWrap Encryption algorithms are working
  */
-public class KeyWrapEncryptionCreationTest {
+public class KeyWrapEncryptionCreationTest extends Assert {
 
     private static KeyPair rsaKeyPair;
     private static boolean bcInstalled;
@@ -107,7 +106,7 @@
     public void testAES128KW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -147,35 +146,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES192KW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -215,35 +214,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES256KW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -283,35 +282,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testTripleDESKW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -349,35 +348,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testRSAv15KW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -414,35 +413,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testRSAOAEPKW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -479,35 +478,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testRSAOAEP11KW() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -544,28 +543,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, rsaKeyPair.getPrivate());
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -574,7 +573,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -614,28 +613,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -644,7 +643,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -684,28 +683,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -714,7 +713,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -754,28 +753,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -784,7 +783,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -824,28 +823,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(document, keyWrappingKey);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     private Document decryptUsingDOM(
@@ -877,4 +876,4 @@
         return cipher.doFinal(document, ee);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionVerificationTest.java
index ce38e8a..44561f4 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/KeyWrapEncryptionVerificationTest.java
@@ -32,6 +32,7 @@
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -54,20 +55,17 @@
 import org.apache.xml.security.test.stax.utils.StAX2DOM;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various KeyWrap Decryption algorithms are working
  */
-public class KeyWrapEncryptionVerificationTest {
+public class KeyWrapEncryptionVerificationTest extends Assert {
 
     private static boolean bcInstalled;
     private static KeyPair rsaKeyPair;
@@ -116,7 +114,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -140,7 +139,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -159,11 +158,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -172,7 +171,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -196,7 +196,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -215,11 +215,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -228,7 +228,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -252,7 +253,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -271,11 +272,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -284,7 +285,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -306,7 +308,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -328,11 +330,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -341,7 +343,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -362,7 +365,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -384,11 +387,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -397,7 +400,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -418,7 +422,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -440,11 +444,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -453,7 +457,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -474,7 +479,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -496,11 +501,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -511,7 +516,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -535,7 +541,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -557,11 +563,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -572,7 +578,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -596,7 +603,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -618,11 +625,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -633,7 +640,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -657,7 +665,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -679,11 +687,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -694,7 +702,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("SEED");
@@ -718,7 +727,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -740,11 +749,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     private void encrypt(
@@ -773,7 +782,7 @@
             String expression = "//*[local-name()='" + localName + "']";
             Element elementToEncrypt =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(elementToEncrypt);
+            Assert.assertNotNull(elementToEncrypt);
 
             document = cipher.doFinal(document, elementToEncrypt, false);
         }
@@ -782,7 +791,7 @@
             XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
             XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
         );
-        assertTrue(nodeList.getLength() > 0);
+        Assert.assertTrue(nodeList.getLength() > 0);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionCreationTest.java
index be62d40..2757d5a 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionCreationTest.java
@@ -45,18 +45,17 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * A test to make sure that the various Symmetric Encryption algorithms are working
  */
-public class SymmetricEncryptionCreationTest {
+public class SymmetricEncryptionCreationTest extends Assert {
 
     private static boolean bcInstalled;
     private XMLInputFactory xmlInputFactory;
@@ -99,7 +98,7 @@
     public void testAES128() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -132,35 +131,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES128_GCM() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -193,35 +192,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES192() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -254,35 +253,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES192_GCM() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -315,35 +314,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES256() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -376,35 +375,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testAES256_GCM() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -437,35 +436,35 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
     public void testTRIPLE_DES() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -497,28 +496,28 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
 
         // Check the CreditCard decrypted ok
         nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -527,7 +526,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -560,21 +559,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
@@ -589,7 +588,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -622,21 +621,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
@@ -651,7 +650,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -684,21 +683,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
@@ -713,7 +712,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -746,21 +745,21 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // Check the CreditCard encrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         nodeList = document.getElementsByTagNameNS(
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Decrypt using DOM API
         Document doc = decryptUsingDOM(algorithm, key, null, document);
@@ -792,4 +791,4 @@
         return cipher.doFinal(document, ee);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionVerificationTest.java
index 7cccbf1..b66eaa6 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/SymmetricEncryptionVerificationTest.java
@@ -31,6 +31,7 @@
 
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -53,20 +54,17 @@
 import org.apache.xml.security.test.stax.utils.StAX2DOM;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  * A test to make sure that the various Symmetric Encryption algorithms are working
  */
-public class SymmetricEncryptionVerificationTest {
+public class SymmetricEncryptionVerificationTest extends Assert {
 
     private static boolean bcInstalled;
     private XMLInputFactory xmlInputFactory;
@@ -112,7 +110,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -129,7 +128,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -151,11 +150,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -164,7 +163,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -181,7 +181,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -203,11 +203,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -216,7 +216,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -233,7 +234,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -255,11 +256,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -268,7 +269,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -285,7 +287,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -307,11 +309,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -320,7 +322,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -337,7 +340,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -359,11 +362,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -372,7 +375,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("AES");
@@ -389,7 +393,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -411,11 +415,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -424,7 +428,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("DESede");
@@ -440,7 +445,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -462,11 +467,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -477,7 +482,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("SEED");
@@ -494,7 +500,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -516,11 +522,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -531,7 +537,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -548,7 +555,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -570,11 +577,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -585,7 +592,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -602,7 +610,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -624,11 +632,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     @Test
@@ -639,7 +647,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyGenerator keygen = KeyGenerator.getInstance("Camellia");
@@ -656,7 +665,7 @@
 
         // Check the CreditCard encrypted ok
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -678,11 +687,11 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the CreditCard decrypted ok
         nodeList = document.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
     }
 
     private void encryptUsingDOM(
@@ -753,7 +762,7 @@
             String expression = "//*[local-name()='" + localName + "']";
             Element elementToEncrypt =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(elementToEncrypt);
+            Assert.assertNotNull(elementToEncrypt);
 
             document = cipher.doFinal(document, elementToEncrypt, content);
         }
@@ -762,7 +771,7 @@
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getNamespaceURI(),
                 XMLSecurityConstants.TAG_xenc_EncryptedData.getLocalPart()
             );
-        assertTrue(nodeList.getLength() > 0);
+        Assert.assertTrue(nodeList.getLength() > 0);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/encryption/XMLEncryption11Test.java b/src/test/java/org/apache/xml/security/test/stax/encryption/XMLEncryption11Test.java
index a23cc54..385a2b9 100644
--- a/src/test/java/org/apache/xml/security/test/stax/encryption/XMLEncryption11Test.java
+++ b/src/test/java/org/apache/xml/security/test/stax/encryption/XMLEncryption11Test.java
@@ -36,13 +36,12 @@
 import javax.crypto.KeyGenerator;
 import javax.crypto.SecretKey;
 import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -64,27 +63,21 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  */
-public class XMLEncryption11Test {
+public class XMLEncryption11Test extends Assert {
 
     private String cardNumber;
     private int nodeCount;
 
     private XMLInputFactory xmlInputFactory;
-    private TransformerFactory transformerFactory = TransformerFactory.newInstance();
 
     @Before
     public void setUp() throws Exception {
@@ -95,7 +88,8 @@
         xmlInputFactory.setEventAllocator(new XMLSecEventAllocator());
 
         String filename = "org/w3c/www/interop/xmlenc-core-11/plaintext.xml";
-        Document doc = XMLUtils.read(this.getClass().getClassLoader().getResourceAsStream(filename), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(this.getClass().getClassLoader().getResourceAsStream(filename));
 
         cardNumber = retrieveCCNumber(doc);
         nodeCount = countNodes(doc);
@@ -413,12 +407,12 @@
         // Perform decryption
         try {
             decryptElementStAX(ed, rsaKey);
-            fail("Exception expected");
+            Assert.fail("Exception expected");
         } catch (XMLStreamException e) {
-            assertTrue(e.getCause() instanceof IOException);
-            assertTrue(e.getCause().getCause() instanceof BadPaddingException);
+            Assert.assertTrue(e.getCause() instanceof IOException);
+            Assert.assertTrue(e.getCause().getCause() instanceof BadPaddingException);
             String cause = e.getCause().getCause().getMessage();
-            assertTrue("mac check in GCM failed".equals(cause) || "Tag mismatch!".equals(cause));
+            Assert.assertTrue("mac check in GCM failed".equals(cause) || "Tag mismatch!".equals(cause));
         }
     }
 
@@ -429,7 +423,8 @@
      * decrypt it and return the resulting document
      */
     private Document decryptElement(String filename, Key rsaKey) throws Exception {
-        Document doc = XMLUtils.read(this.getClass().getClassLoader().getResourceAsStream(filename), false);
+        DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
+        Document doc = db.parse(this.getClass().getClassLoader().getResourceAsStream(filename));
 
         return decryptElement(doc, rsaKey);
     }
@@ -455,17 +450,13 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         TestSecurityEventListener securityEventListener = new TestSecurityEventListener();
 
-        javax.xml.transform.Transformer transformer = transformerFactory.newTransformer();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        transformer.transform(new DOMSource(doc), new StreamResult(baos));
-
         final XMLStreamReader xmlStreamReader =
-            xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(baos.toByteArray()));
+                xmlInputFactory.createXMLStreamReader(new DOMSource(doc));
 
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        return StAX2DOM.readDoc(securityStreamReader);
+        return StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     /**
@@ -510,7 +501,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
 
@@ -538,32 +529,32 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("urn:example:po", "PaymentInfo");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         NodeList encryptionMethodElements = document.getElementsByTagNameNS(XMLSecurityConstants.NS_XMLENC, "EncryptionMethod");
-        assertEquals(2, encryptionMethodElements.getLength());
-        assertEquals(encryptionMethodAlgo, ((Element) encryptionMethodElements.item(0)).getAttribute("Algorithm"));
-        assertEquals(encryptedKeyAlgo, ((Element) encryptionMethodElements.item(1)).getAttribute("Algorithm"));
+        Assert.assertEquals(2, encryptionMethodElements.getLength());
+        Assert.assertEquals(encryptionMethodAlgo, ((Element) encryptionMethodElements.item(0)).getAttribute("Algorithm"));
+        Assert.assertEquals(encryptedKeyAlgo, ((Element) encryptionMethodElements.item(1)).getAttribute("Algorithm"));
 
         if (digestMethodAlgo != null) {
             NodeList digestMethodElements = document.getElementsByTagNameNS(XMLSecurityConstants.NS_DSIG, "DigestMethod");
-            assertEquals(1, digestMethodElements.getLength());
-            assertEquals(digestMethodAlgo, ((Element) digestMethodElements.item(0)).getAttribute("Algorithm"));
+            Assert.assertEquals(1, digestMethodElements.getLength());
+            Assert.assertEquals(digestMethodAlgo, ((Element) digestMethodElements.item(0)).getAttribute("Algorithm"));
         }
         if (mgfAlgo != null) {
             NodeList mfgElements = document.getElementsByTagNameNS(XMLSecurityConstants.NS_XMLENC11, "MGF");
-            assertEquals(1, mfgElements.getLength());
-            assertEquals(mgfAlgo, ((Element) mfgElements.item(0)).getAttribute("Algorithm"));
+            Assert.assertEquals(1, mfgElements.getLength());
+            Assert.assertEquals(mgfAlgo, ((Element) mfgElements.item(0)).getAttribute("Algorithm"));
         }
         if (oaepParams != null) {
             NodeList oaepParamsElements = document.getElementsByTagNameNS(XMLSecurityConstants.NS_XMLENC, "OAEPparams");
-            assertEquals(1, oaepParamsElements.getLength());
+            Assert.assertEquals(1, oaepParamsElements.getLength());
             String content = XMLUtils.getFullTextChildrenFromNode(oaepParamsElements.item(0));
-            assertArrayEquals(oaepParams, XMLUtils.decode(content));
+            Assert.assertArrayEquals(oaepParams, XMLUtils.decode(content));
         }
         return document;
     }
@@ -632,7 +623,7 @@
     private void checkDecryptedDoc(Document d, boolean doNodeCheck) throws Exception {
 
         String cc = retrieveCCNumber(d);
-        assertEquals(cardNumber, cc);
+        assertTrue(cc, cc != null && cc.equals(cardNumber));
 
         // Test cc numbers
         if (doNodeCheck) {
diff --git a/src/test/java/org/apache/xml/security/test/stax/performance/AbstractPerformanceTest.java b/src/test/java/org/apache/xml/security/test/stax/performance/AbstractPerformanceTest.java
index e11568d..80c2224 100644
--- a/src/test/java/org/apache/xml/security/test/stax/performance/AbstractPerformanceTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/performance/AbstractPerformanceTest.java
@@ -18,13 +18,28 @@
  */
 package org.apache.xml.security.test.stax.performance;
 
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.OutputStream;
+import org.apache.xml.security.encryption.XMLCipher;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.signature.XMLSignature;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
+import org.apache.xml.security.transforms.Transforms;
+import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.crypto.KeyGenerator;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.security.Key;
 import java.security.KeyStore;
@@ -32,33 +47,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.crypto.KeyGenerator;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import org.apache.xml.security.encryption.XMLCipher;
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.signature.XMLSignature;
-import org.apache.xml.security.stax.ext.InboundXMLSec;
-import org.apache.xml.security.stax.ext.OutboundXMLSec;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.XMLSec;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
-import org.apache.xml.security.transforms.Transforms;
-import org.apache.xml.security.utils.XMLUtils;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-
 /**
  */
 public abstract class AbstractPerformanceTest {
@@ -136,8 +124,10 @@
         XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(fileInputStream);
         while (xmlStreamReader.hasNext()) {
             xmlStreamReader.next();
-            if (XMLStreamConstants.START_ELEMENT == xmlStreamReader.getEventType()) {
-                i++;
+            switch (xmlStreamReader.getEventType()) {
+                case XMLStreamConstants.START_ELEMENT:
+                    i++;
+                    break;
             }
         }
         xmlStreamReader.close();
@@ -149,7 +139,7 @@
 
     protected void setUpOutboundSignatureXMLSec() throws XMLSecurityException {
         XMLSecurityProperties xmlSecurityProperties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         xmlSecurityProperties.setActions(actions);
         xmlSecurityProperties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_X509KeyIdentifier);
@@ -180,7 +170,7 @@
 
     protected void setUpOutboundEncryptionXMLSec() throws XMLSecurityException {
         XMLSecurityProperties xmlSecurityProperties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         xmlSecurityProperties.setActions(actions);
         xmlSecurityProperties.setEncryptionKey(encryptionSymKey);
@@ -234,7 +224,8 @@
 
     protected void doDOMSignatureOutbound(File file, int tagCount) throws Exception {
 
-        Document document = XMLUtils.read(new FileInputStream(file), false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(file);
 
         XMLSignature sig = new XMLSignature(document, "", "http://www.w3.org/2000/09/xmldsig#rsa-sha1");
         Element root = document.getDocumentElement();
@@ -253,7 +244,8 @@
 
     protected void doDOMSignatureInbound(File file, int tagCount) throws Exception {
 
-        Document document = XMLUtils.read(new FileInputStream(file), false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(file);
 
         Element signatureElement = (Element) document.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature").item(0);
         ((Element) signatureElement.getParentNode()).setIdAttributeNS(null, "Id", true);
@@ -294,7 +286,8 @@
 
     protected void doDOMEncryptionOutbound(File file, int tagCount) throws Exception {
 
-        Document document = XMLUtils.read(new FileInputStream(file), false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(file);
 
         XMLCipher cipher = XMLCipher.getInstance("http://www.w3.org/2001/04/xmlenc#aes256-cbc");
         cipher.init(XMLCipher.ENCRYPT_MODE, encryptionSymKey);
@@ -305,7 +298,8 @@
 
     protected void doDOMDecryptionInbound(File file, int tagCount) throws Exception {
 
-        Document document = XMLUtils.read(new FileInputStream(file), false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(file);
 
         XMLCipher cipher = XMLCipher.getInstance("http://www.w3.org/2001/04/xmlenc#aes256-cbc");
         cipher.init(XMLCipher.DECRYPT_MODE, encryptionSymKey);
diff --git a/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceMemoryTest.java b/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceMemoryTest.java
index 872f22f..93913e7 100644
--- a/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceMemoryTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceMemoryTest.java
@@ -35,8 +35,8 @@
     private static final int xmlResizeFactor = 1000;
 
     //junit creates for every test method a new class instance so we need a static list
-    private static Map<Integer, File> signedFiles = new TreeMap<>();
-    private static Map<Integer, File> encryptedFiles = new TreeMap<>();
+    private static Map<Integer, File> signedFiles = new TreeMap<Integer, File>();
+    private static Map<Integer, File> encryptedFiles = new TreeMap<Integer, File>();
 
 
     @Override
@@ -219,7 +219,7 @@
         private long memoryDiff;
         private volatile boolean stop = false;
 
-        private List<Integer> memory = new LinkedList<>();
+        private List<Integer> memory = new LinkedList<Integer>();
 
         MemorySamplerThread(long memoryDiff) {
             this.memoryDiff = memoryDiff;
diff --git a/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceTimingTest.java b/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceTimingTest.java
index 85aa540..568ffe8 100644
--- a/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceTimingTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/performance/PerformanceTimingTest.java
@@ -36,8 +36,8 @@
     private static final int runs = 40;
     private static final int xmlResizeFactor = 1000;
 
-    private static Map<Integer, File> signedFiles = new TreeMap<>();
-    private static Map<Integer, File> encryptedFiles = new TreeMap<>();
+    private static Map<Integer, File> signedFiles = new TreeMap<Integer, File>();
+    private static Map<Integer, File> encryptedFiles = new TreeMap<Integer, File>();
 
 
     @Override
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureCreationTest.java
index 9127926..73cb6bf 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureCreationTest.java
@@ -37,18 +37,14 @@
 import org.apache.xml.security.utils.resolver.ResourceResolverContext;
 import org.apache.xml.security.utils.resolver.ResourceResolverException;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
+import org.junit.Assert;
 import org.junit.Before;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-
 /**
  */
-public class AbstractSignatureCreationTest {
+public class AbstractSignatureCreationTest extends Assert {
 
     protected static String BASEDIR;
 
@@ -107,7 +103,7 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         for (SecurePart securePart : secureParts) {
             if (securePart.getName() == null) {
@@ -116,7 +112,7 @@
             expression = "//*[local-name()='" + securePart.getName().getLocalPart() + "']";
             Element signedElement =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(signedElement);
+            Assert.assertNotNull(signedElement);
             signedElement.setIdAttributeNS(null, idAttributeNS, true);
         }
 
@@ -126,10 +122,10 @@
         }
         if (keyInfoRequired) {
             KeyInfo ki = signature.getKeyInfo();
-            assertNotNull(ki);
+            Assert.assertNotNull(ki);
         }
 
-        assertTrue(signature.checkSignatureValue(cert));
+        Assert.assertTrue(signature.checkSignatureValue(cert));
     }
 
     /**
@@ -145,18 +141,18 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         for (SecurePart securePart : secureParts) {
             expression = "//*[local-name()='" + securePart.getName().getLocalPart() + "']";
             Element signedElement =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(signedElement);
+            Assert.assertNotNull(signedElement);
             signedElement.setIdAttributeNS(null, "Id", true);
         }
 
         XMLSignature signature = new XMLSignature(sigElement, "");
-        assertTrue(signature.checkSignatureValue(key));
+        Assert.assertTrue(signature.checkSignatureValue(key));
     }
 
     protected void verifyUsingDOMWihtoutId(
@@ -169,22 +165,22 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
-        assertEquals("", sigElement.getAttribute("Id"));
+        Assert.assertNotNull(sigElement);
+        Assert.assertEquals("", sigElement.getAttribute("Id"));
 
         assertEquals("Without Id there can only be one secure part", 1, secureParts.size());
         expression = "//*[local-name()='" + secureParts.get(0).getName().getLocalPart() + "']";
         Element signedElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(signedElement);
-        assertEquals("", signedElement.getAttribute("Id"));
+        Assert.assertNotNull(signedElement);
+        Assert.assertEquals("", signedElement.getAttribute("Id"));
 
         XMLSignature signature = new XMLSignature(sigElement, "");
 
         // We need a special resolver for the empty URI
         signature.addResourceResolver(new EmptyURIResourceResolverSpi(signedElement));
 
-        assertTrue(signature.checkSignatureValue(key));
+        Assert.assertTrue(signature.checkSignatureValue(key));
     }
 
     protected void verifyUsingDOMWihtoutIdAndDefaultTransform (
@@ -197,8 +193,8 @@
         String expression = "//dsig:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
-        assertEquals("", sigElement.getAttribute("Id"));
+        Assert.assertNotNull(sigElement);
+        Assert.assertEquals("", sigElement.getAttribute("Id"));
 
         assertEquals("Without Id there can only be one secure part", 1, secureParts.size());
         //assertNull(secureParts.get(0).getName());
@@ -210,7 +206,7 @@
         // We need a special resolver for the empty URI
         signature.addResourceResolver(new EmptyURIResourceResolverSpi(signedElement));
 
-        assertTrue(signature.checkSignatureValue(key));
+        Assert.assertTrue(signature.checkSignatureValue(key));
     }
 
     private XPath getxPath() {
@@ -240,4 +236,4 @@
             return context.uriToResolve.isEmpty();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureVerificationTest.java
index d18129f..4cbdbea 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/AbstractSignatureVerificationTest.java
@@ -18,22 +18,6 @@
  */
 package org.apache.xml.security.test.stax.signature;
 
-import java.io.File;
-import java.security.Key;
-import java.security.cert.X509Certificate;
-import java.util.List;
-import java.util.UUID;
-
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.stax.config.Init;
@@ -42,31 +26,32 @@
 import org.apache.xml.security.stax.impl.securityToken.X509IssuerSerialSecurityToken;
 import org.apache.xml.security.stax.impl.securityToken.X509SecurityToken;
 import org.apache.xml.security.stax.impl.securityToken.X509SubjectNameSecurityToken;
-import org.apache.xml.security.stax.securityEvent.AlgorithmSuiteSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.DefaultTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.KeyNameTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.KeyValueTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
-import org.apache.xml.security.stax.securityEvent.SignatureValueSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SignedElementSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.X509TokenSecurityEvent;
+import org.apache.xml.security.stax.securityEvent.*;
 import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
 import org.apache.xml.security.test.dom.DSNamespaceContext;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
-
+import org.junit.Assert;
 import org.junit.Before;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+import java.io.File;
+import java.security.Key;
+import java.security.cert.X509Certificate;
+import java.util.List;
+import java.util.UUID;
 
 /**
  */
-public class AbstractSignatureVerificationTest {
+public class AbstractSignatureVerificationTest extends Assert {
 
     protected static String BASEDIR;
 
@@ -239,7 +224,7 @@
                     (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
             for (int i = 0; i < elementsToSign.getLength(); i++) {
                 Element elementToSign = (Element)elementsToSign.item(i);
-                assertNotNull(elementToSign);
+                Assert.assertNotNull(elementToSign);
                 String id = UUID.randomUUID().toString();
                 elementToSign.setAttributeNS(null, "Id", id);
                 elementToSign.setIdAttributeNS(null, "Id", true);
@@ -271,7 +256,7 @@
         String expression = "//ds:Signature[1]";
         Element sigElement =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(sigElement);
+        Assert.assertNotNull(sigElement);
 
         return sig;
     }
@@ -449,4 +434,4 @@
             this.binary = binary;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/BaltimoreTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/BaltimoreTest.java
index 3fa526b..ee69bcc 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/BaltimoreTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/BaltimoreTest.java
@@ -38,6 +38,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -66,22 +67,17 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This test is to ensure interoperability with the examples provided by Merlin Huges
  * from Baltimore using KeyTools XML. These test vectors are located in the directory
  * <CODE>data/ie/baltimore/merlin-examples/</CODE>.
  */
-public class BaltimoreTest {
+public class BaltimoreTest extends Assert {
 
     // Define the Keys
     private static final String DSA_Y_15 =
@@ -129,7 +125,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-hmac-sha1.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -155,7 +152,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, key,
@@ -168,7 +165,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-hmac-sha1-40.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -193,11 +191,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a short HMAC length");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
     }
 
@@ -208,7 +206,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloped-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -229,7 +228,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 15),
@@ -242,7 +241,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-b64-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -263,7 +263,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 15),
@@ -276,7 +276,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -297,7 +298,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 15),
@@ -310,7 +311,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-enveloping-rsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -331,7 +333,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("RSA", 15),
@@ -356,7 +358,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-external-b64-dsa.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             Key publicKey = getPublicKey("DSA", 15);
@@ -381,7 +384,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, getPublicKey("DSA", 15),
@@ -411,7 +414,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-fifteen/signature-external-dsa.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             Key publicKey = getPublicKey("DSA", 15);
@@ -436,7 +440,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, getPublicKey("DSA", 15),
@@ -453,7 +457,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -479,7 +484,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, key,
@@ -492,7 +497,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloping-hmac-sha1-40.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -517,11 +523,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a short HMAC length");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
     }
 
@@ -532,7 +538,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloped-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         Key publicKey = getPublicKey("DSA", 23);
@@ -557,7 +564,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 23),
@@ -570,7 +577,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloping-b64-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         Key publicKey = getPublicKey("DSA", 23);
@@ -595,7 +603,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 23),
@@ -608,7 +616,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloping-dsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -629,7 +638,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA", 23),
@@ -642,7 +651,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-enveloping-rsa.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -663,7 +673,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("RSA", 23),
@@ -689,7 +699,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-external-b64-dsa.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             Key publicKey = getPublicKey("DSA", 23);
@@ -714,7 +725,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, getPublicKey("RSA", 23),
@@ -744,7 +755,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-external-dsa.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             Key publicKey = getPublicKey("DSA", 23);
@@ -769,7 +781,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, getPublicKey("RSA", 23),
@@ -799,7 +811,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-keyname.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             CertificateFactory cf = CertificateFactory.getInstance("X509");
@@ -829,7 +842,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -859,7 +872,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-retrievalmethod-rawx509crt.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             CertificateFactory cf = CertificateFactory.getInstance("X509");
@@ -887,7 +901,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -913,7 +927,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-x509-crt-crl.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -932,7 +947,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -958,7 +973,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-x509-crt.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -977,7 +993,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1003,7 +1019,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-x509-is.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1033,7 +1050,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -1063,7 +1080,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-x509-ski.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1091,7 +1109,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1117,7 +1135,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/signature-x509-sn.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1147,7 +1166,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -1164,7 +1183,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-exc-c14n-one/exc-signature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -1183,7 +1203,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -1204,7 +1224,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-keyname.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             CertificateFactory cf = CertificateFactory.getInstance("X509");
@@ -1234,7 +1255,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -1264,7 +1285,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-retrievalmethod-rawx509crt.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             CertificateFactory cf = CertificateFactory.getInstance("X509");
@@ -1292,7 +1314,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1318,7 +1340,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-x509-crt-crl.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1337,7 +1360,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1363,7 +1386,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-x509-crt.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1382,7 +1406,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1408,7 +1432,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-x509-is.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1438,7 +1463,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -1468,7 +1493,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-x509-ski.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1496,7 +1522,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -1522,7 +1548,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmldsig-eighteen/signature-x509-sn.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -1552,7 +1579,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
             // Check the SecurityEvents
             checkSignatureToken(securityEventListener, cert.getPublicKey(),
@@ -1568,7 +1595,7 @@
             throws InvalidKeySpecException, NoSuchAlgorithmException {
         KeyFactory kf = KeyFactory.getInstance(algo);
         KeySpec kspec = null;
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             if (number == 15) {
                 kspec = new DSAPublicKeySpec(new BigInteger(DSA_Y_15),
                         new BigInteger(DSA_P_15),
@@ -1580,7 +1607,7 @@
                         new BigInteger(DSA_Q_23),
                         new BigInteger(DSA_G_23));
             }
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             if (number == 15) {
                 kspec = new RSAPublicKeySpec(new BigInteger(RSA_MOD_15),
                         new BigInteger(RSA_PUB));
@@ -1638,4 +1665,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/IAIKTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/IAIKTest.java
index 927abfc..fd5238a 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/IAIKTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/IAIKTest.java
@@ -34,6 +34,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -60,22 +61,17 @@
 import org.apache.xml.security.test.stax.utils.TestUtils;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This test is to ensure interoperability with the examples provided by the IAIK
  * XML Signature implementation. Thanks to Gregor Karlinger who provided these
  * test vectors. They are located in the directory <CODE>data/at/iaik/ixsil/</CODE>.
  */
-public class IAIKTest {
+public class IAIKTest extends Assert {
 
     // Define the Keys
     private static final String DSA_Y =
@@ -112,7 +108,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "at/iaik/ixsil/signatureAlgorithms/signatures/hMACSignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -138,7 +135,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, key, SecurityTokenConstants.KeyIdentifier_NoKeyInfo);
@@ -150,7 +147,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "at/iaik/ixsil/signatureAlgorithms/signatures/hMACShortSignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -172,11 +170,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a short HMAC length");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
     }
 
@@ -186,7 +184,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "at/iaik/ixsil/signatureAlgorithms/signatures/dSASignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -207,7 +206,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("DSA"),
@@ -220,7 +219,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "at/iaik/ixsil/signatureAlgorithms/signatures/rSASignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -241,7 +241,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("RSA"),
@@ -272,7 +272,7 @@
 
         try {
             TestUtils.switchAllowNotSameDocumentReferences(true);
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
         }
@@ -306,7 +306,7 @@
 
         try {
             TestUtils.switchAllowNotSameDocumentReferences(true);
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
         }
@@ -322,7 +322,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "at/iaik/ixsil/transforms/signatures/envelopedSignatureSignature.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         Key publicKey = getPublicKey("RSA");
@@ -347,7 +348,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, getPublicKey("RSA"),
@@ -358,12 +359,12 @@
             throws InvalidKeySpecException, NoSuchAlgorithmException {
         KeyFactory kf = KeyFactory.getInstance(algo);
         KeySpec kspec = null;
-        if ("DSA".equalsIgnoreCase(algo)) {
+        if (algo.equalsIgnoreCase("DSA")) {
             kspec = new DSAPublicKeySpec(new BigInteger(DSA_Y),
                         new BigInteger(DSA_P),
                         new BigInteger(DSA_Q),
                         new BigInteger(DSA_G));
-        } else if ("RSA".equalsIgnoreCase(algo)) {
+        } else if (algo.equalsIgnoreCase("RSA")) {
             kspec = new RSAPublicKeySpec(new BigInteger(RSA_MOD),
                     new BigInteger(RSA_PUB));
         } else {
@@ -412,4 +413,4 @@
         }
 
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureCreationTest.java
index 0e982a6..b6c2366 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureCreationTest.java
@@ -91,7 +91,7 @@
     public void testRSA_SHA1() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -123,7 +123,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -134,7 +134,7 @@
     public void testRSA_SHA256() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -166,7 +166,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -177,7 +177,7 @@
     public void testRSA_SHA384() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -209,7 +209,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -220,7 +220,7 @@
     public void testRSA_SHA512() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -252,7 +252,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -265,7 +265,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -297,7 +297,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -310,7 +310,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -342,7 +342,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -355,7 +355,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -387,7 +387,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -400,7 +400,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -432,7 +432,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -445,7 +445,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -477,7 +477,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -490,7 +490,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -522,7 +522,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -533,7 +533,7 @@
     public void testECDSA_SHA1() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -565,7 +565,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -576,7 +576,7 @@
     public void testECDSA_SHA224() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -608,7 +608,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -619,7 +619,7 @@
     public void testECDSA_SHA256() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -651,7 +651,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -662,7 +662,7 @@
     public void testECDSA_SHA384() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -694,7 +694,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -705,7 +705,7 @@
     public void testECDSA_SHA512() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -737,7 +737,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -750,7 +750,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -782,7 +782,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureVerificationTest.java
index a90febe..82cbbe0 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/PKSignatureVerificationTest.java
@@ -29,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -103,7 +104,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
         List<String> localNames = new ArrayList<>();
@@ -134,7 +136,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -143,7 +145,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
         List<String> localNames = new ArrayList<>();
@@ -174,7 +177,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -183,7 +186,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384";
         List<String> localNames = new ArrayList<>();
@@ -214,7 +218,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -223,7 +227,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512";
         List<String> localNames = new ArrayList<>();
@@ -254,7 +259,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -265,7 +270,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-ripemd160";
         List<String> localNames = new ArrayList<>();
@@ -296,7 +302,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -307,7 +313,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#sha1-rsa-MGF1";
         List<String> localNames = new ArrayList<>();
@@ -338,7 +345,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -349,7 +356,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#sha224-rsa-MGF1";
         List<String> localNames = new ArrayList<>();
@@ -380,7 +388,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -391,7 +399,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1";
         List<String> localNames = new ArrayList<>();
@@ -422,7 +431,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -433,7 +442,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#sha384-rsa-MGF1";
         List<String> localNames = new ArrayList<>();
@@ -464,7 +474,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -475,7 +485,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1";
         List<String> localNames = new ArrayList<>();
@@ -506,7 +517,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -515,7 +526,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1";
         List<String> localNames = new ArrayList<>();
@@ -546,7 +558,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -555,7 +567,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha224";
         List<String> localNames = new ArrayList<>();
@@ -586,7 +599,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -595,7 +608,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256";
         List<String> localNames = new ArrayList<>();
@@ -626,7 +640,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -635,7 +649,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384";
         List<String> localNames = new ArrayList<>();
@@ -666,7 +681,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -675,7 +690,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512";
         List<String> localNames = new ArrayList<>();
@@ -706,7 +722,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -717,7 +733,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         String signatureAlgorithm = "http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160";
         List<String> localNames = new ArrayList<>();
@@ -748,7 +765,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
 
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/PhaosTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/PhaosTest.java
index b5e0ba8..d5b200c 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/PhaosTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/PhaosTest.java
@@ -30,12 +30,14 @@
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -50,16 +52,11 @@
 import java.net.Proxy;
 import java.nio.charset.StandardCharsets;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * This is a testcase to validate all "phaos-xmldsig-three"
  * testcases from Phaos
  */
-public class PhaosTest {
+public class PhaosTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
     private TransformerFactory transformerFactory = TransformerFactory.newInstance();
@@ -94,7 +91,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "com/phaos/phaos-xmldsig-three/signature-dsa-detached.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -115,7 +113,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -129,7 +127,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-dsa-enveloped.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -150,7 +149,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -159,7 +158,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-dsa-enveloping.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -180,7 +180,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     // See SANTUARIO-319
@@ -202,7 +202,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "com/phaos/phaos-xmldsig-three/signature-hmac-sha1-exclusive-c14n-comments-detached.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the key
             byte[] hmacKey = "test".getBytes(StandardCharsets.US_ASCII);
@@ -228,7 +229,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -242,7 +243,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-hmac-sha1-exclusive-c14n-enveloped.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the key
         byte[] hmacKey = "test".getBytes(StandardCharsets.US_ASCII);
@@ -268,7 +270,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -277,7 +279,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-rsa-detached-b64-transform.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the key
         byte[] hmacKey = "test".getBytes(StandardCharsets.US_ASCII);
@@ -305,7 +308,7 @@
 
         try {
             TestUtils.switchDoNotThrowExceptionForManifests(true);
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchDoNotThrowExceptionForManifests(false);
         }
@@ -330,7 +333,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "com/phaos/phaos-xmldsig-three/signature-rsa-detached.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // XMLUtils.outputDOM(document, System.out);
 
@@ -351,7 +355,7 @@
             XMLStreamReader securityStreamReader =
                     inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -365,7 +369,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-rsa-enveloped-bad-digest-val.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -385,11 +390,11 @@
         TestSecurityEventListener securityEventListener = new TestSecurityEventListener();
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a bad digest");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
     }
 
@@ -400,7 +405,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-rsa-enveloped.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -421,7 +427,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -430,7 +436,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/phaos/phaos-xmldsig-three/signature-rsa-enveloping.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -451,7 +458,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/RSASecurityTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/RSASecurityTest.java
index 84f2aad..2591cdc 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/RSASecurityTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/RSASecurityTest.java
@@ -22,6 +22,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -66,7 +67,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/rsasecurity/bdournaee/certj201_enveloping.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -87,7 +89,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, null, null,
@@ -101,7 +103,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "com/rsasecurity/bdournaee/certj201_enveloped.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // XMLUtils.outputDOM(document, System.out);
 
@@ -122,7 +125,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSignatureToken(securityEventListener, null, null,
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationReferenceURIResolverTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationReferenceURIResolverTest.java
index ec48c22..3a08275 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationReferenceURIResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationReferenceURIResolverTest.java
@@ -45,15 +45,12 @@
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP;
+import org.junit.Assert;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 /**
  */
 public class SignatureCreationReferenceURIResolverTest extends AbstractSignatureCreationTest {
@@ -62,7 +59,7 @@
     public void testSignatureCreationWithExternalFilesystemXMLReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -102,7 +99,7 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -113,7 +110,7 @@
     public void testSignatureCreationWithExternalFilesystemBinaryReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -153,7 +150,7 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -174,7 +171,7 @@
 
             // Set up the Configuration
             XMLSecurityProperties properties = new XMLSecurityProperties();
-            List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+            List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
             actions.add(XMLSecurityConstants.SIGNATURE);
             properties.setActions(actions);
 
@@ -210,7 +207,7 @@
 
             Document document = null;
             try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-                document = XMLUtils.read(is, false);
+                document = XMLUtils.createDocumentBuilder(false).parse(is);
             }
 
             // Verify using DOM
@@ -224,7 +221,7 @@
     public void testSignatureCreationWithSameDocumentXPointerIdApostropheReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -257,17 +254,17 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Reference");
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
 
         String uri = ((Element) nodeList.item(0)).getAttribute("URI");
-        assertNotNull(uri);
-        assertTrue(uri.startsWith("#xpointer"));
+        Assert.assertNotNull(uri);
+        Assert.assertTrue(uri.startsWith("#xpointer"));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationTest.java
index ba57fe0..8d7cd83 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureCreationTest.java
@@ -18,6 +18,32 @@
  */
 package org.apache.xml.security.test.stax.signature;
 
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.signature.XMLSignature;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
+import org.apache.xml.security.stax.securityEvent.SignatureValueSecurityEvent;
+import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
+import org.apache.xml.security.test.dom.DSNamespaceContext;
+import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
+import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
@@ -30,43 +56,8 @@
 import java.util.Arrays;
 import java.util.List;
 
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathFactory;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.xml.security.exceptions.XMLSecurityException;
-import org.apache.xml.security.signature.XMLSignature;
-import org.apache.xml.security.stax.ext.OutboundXMLSec;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.XMLSec;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
-import org.apache.xml.security.stax.securityEvent.SignatureValueSecurityEvent;
-import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
-import org.apache.xml.security.test.dom.DSNamespaceContext;
-import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
-import org.apache.xml.security.utils.XMLUtils;
-
-import org.junit.Test;
-
 import static org.apache.xml.security.stax.ext.XMLSecurityConstants.NS_C14N_EXCL;
 import static org.apache.xml.security.stax.ext.XMLSecurityConstants.NS_XMLDSIG_ENVELOPED_SIGNATURE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 /**
  * A set of test-cases for Signature creation.
@@ -77,7 +68,7 @@
     public void testSignatureCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -111,7 +102,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         //first child element must be the dsig:Signature @see SANTUARIO-324:
@@ -119,7 +110,7 @@
         while (childNode != null) {
             if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                 Element element = (Element)childNode;
-                assertEquals(element.getLocalName(), "Signature");
+                Assert.assertEquals(element.getLocalName(), "Signature");
                 break;
             }
             childNode = childNode.getNextSibling();
@@ -133,7 +124,7 @@
     public void testSignatureCreationRetrieveSignatureValue() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -169,7 +160,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Check Signature bytes
@@ -186,7 +177,7 @@
     public void testExceptionOnElementToSignNotFound() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -217,10 +208,10 @@
         try {
             XmlReaderToWriter.writeAll(xmlStreamReader, xmlStreamWriter);
             xmlStreamWriter.close();
-            fail("Exception expected");
+            Assert.fail("Exception expected");
         } catch (XMLStreamException e) {
-            assertTrue(e.getCause() instanceof XMLSecurityException);
-            assertEquals("Part to sign not found: {urn:example:po}NotExistingElement", e.getCause().getMessage());
+            Assert.assertTrue(e.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("Part to sign not found: {urn:example:po}NotExistingElement", e.getCause().getMessage());
         }
     }
 
@@ -228,7 +219,7 @@
     public void testEnvelopedSignatureCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -270,7 +261,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         //first child element must be the dsig:Signature @see SANTUARIO-324:
@@ -278,7 +269,7 @@
         while (childNode != null) {
             if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                 Element element = (Element)childNode;
-                assertEquals(element.getLocalName(), "Signature");
+                Assert.assertEquals(element.getLocalName(), "Signature");
                 break;
             }
             childNode = childNode.getNextSibling();
@@ -292,7 +283,7 @@
     public void testSignRootElementInRequest() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -334,7 +325,7 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         //first child element must be the dsig:Signature @see SANTUARIO-324:
@@ -342,7 +333,7 @@
         while (childNode != null) {
             if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                 Element element = (Element)childNode;
-                assertEquals(element.getLocalName(), "Signature");
+                Assert.assertEquals(element.getLocalName(), "Signature");
                 break;
             }
             childNode = childNode.getNextSibling();
@@ -377,7 +368,7 @@
     private void signAtSpecificPosition(int position, QName positionQName, boolean start) throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -424,7 +415,7 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         //find first child element:
@@ -459,7 +450,7 @@
             }
         }
 
-        assertEquals(childNode.getLocalName(), "Signature");
+        Assert.assertEquals(childNode.getLocalName(), "Signature");
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -469,7 +460,7 @@
     public void testIdAttributeNS() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -514,7 +505,7 @@
 
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -526,7 +517,7 @@
     public void testMultipleElements() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -563,7 +554,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -574,7 +565,7 @@
     public void testMultipleSignatures() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -619,7 +610,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -630,7 +621,7 @@
         String expression = "//dsig:Signature";
         NodeList sigElements =
                 (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
-        assertTrue(sigElements.getLength() == 2);
+        Assert.assertTrue(sigElements.getLength() == 2);
 
         for (SecurePart secPart : properties.getSignatureSecureParts()) {
             if (secPart.getName() == null) {
@@ -639,13 +630,13 @@
             expression = "//*[local-name()='" + secPart.getName().getLocalPart() + "']";
             Element signedElement =
                     (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-            assertNotNull(signedElement);
+            Assert.assertNotNull(signedElement);
             signedElement.setIdAttributeNS(null, "Id", true);
         }
 
         for (int i = 0; i < sigElements.getLength(); i++) {
             XMLSignature signature = new XMLSignature((Element)sigElements.item(i), "");
-            assertTrue(signature.checkSignatureValue(cert));
+            Assert.assertTrue(signature.checkSignatureValue(cert));
         }
     }
 
@@ -653,7 +644,7 @@
     public void testHMACSignatureCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -683,7 +674,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -694,7 +685,7 @@
     public void testStrongSignatureCreation() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -731,7 +722,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -754,7 +745,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -791,7 +782,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -814,7 +805,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -852,7 +843,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -863,7 +854,7 @@
     public void testDifferentC14nMethod() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -899,7 +890,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -910,7 +901,7 @@
     public void testDifferentC14nMethodForReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -947,28 +938,28 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_CanonicalizationMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_CanonicalizationMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_Transform.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_Transform.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_SignatureMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_SignatureMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals(XMLSecurityConstants.NS_XMLDSIG_RSASHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(XMLSecurityConstants.NS_XMLDSIG_RSASHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals(XMLSecurityConstants.NS_XMLDSIG_SHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(XMLSecurityConstants.NS_XMLDSIG_SHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -978,7 +969,7 @@
     public void testDifferentDigestMethodForReference() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -1015,28 +1006,28 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_CanonicalizationMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_CanonicalizationMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_Transform.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_Transform.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(NS_C14N_EXCL, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_SignatureMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_SignatureMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals(XMLSecurityConstants.NS_XMLDSIG_RSASHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(XMLSecurityConstants.NS_XMLDSIG_RSASHA1, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         element = (Element)nodeList.item(0);
-        assertEquals("http://www.w3.org/2001/04/xmlenc#sha256", element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals("http://www.w3.org/2001/04/xmlenc#sha256", element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -1046,7 +1037,7 @@
     public void testC14n11Method() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -1082,7 +1073,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1093,7 +1084,7 @@
     public void testExcC14nInclusivePrefixes() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -1130,13 +1121,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_c14nExcl_InclusiveNamespaces.getNamespaceURI(), XMLSecurityConstants.TAG_c14nExcl_InclusiveNamespaces.getLocalPart());
-        assertEquals(2, nodeList.getLength());
-        assertEquals("", ((Element)nodeList.item(0)).getAttribute(XMLSecurityConstants.ATT_NULL_PrefixList.getLocalPart()));
-        assertEquals("", ((Element)nodeList.item(1)).getAttribute(XMLSecurityConstants.ATT_NULL_PrefixList.getLocalPart()));
+        Assert.assertEquals(2, nodeList.getLength());
+        Assert.assertEquals("", ((Element)nodeList.item(0)).getAttribute(XMLSecurityConstants.ATT_NULL_PrefixList.getLocalPart()));
+        Assert.assertEquals("", ((Element)nodeList.item(1)).getAttribute(XMLSecurityConstants.ATT_NULL_PrefixList.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -1146,7 +1137,7 @@
     public void testSignatureCreationKeyValue() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyValue);
@@ -1181,7 +1172,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1200,7 +1191,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_SkiKeyIdentifier);
@@ -1236,7 +1227,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1247,7 +1238,7 @@
     public void testSignatureCreationX509Certificate() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_X509KeyIdentifier);
@@ -1282,7 +1273,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1293,7 +1284,7 @@
     public void testSignatureCreationX509SubjectName() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_X509SubjectName);
@@ -1328,7 +1319,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1339,7 +1330,7 @@
     public void testSignatureCreationMultipleKeyIdentifiers() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         List<SecurityTokenConstants.KeyIdentifier> signatureKeyIdentifiers =
@@ -1378,7 +1369,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1389,7 +1380,7 @@
     public void testSignatureCreationTransformBase64() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -1426,7 +1417,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1437,7 +1428,7 @@
     public void testNoKeyInfo() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -1474,7 +1465,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -1486,7 +1477,7 @@
     public void testSignatureCreationKeyName() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyName);
@@ -1522,7 +1513,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_KeyName.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_KeyName.getLocalPart());
@@ -1537,7 +1528,7 @@
     public void testSignatureCreationWithoutId() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyName);
@@ -1573,7 +1564,7 @@
 
         //System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document =
-                XMLUtils.read(new ByteArrayInputStream(baos.toByteArray()), false);
+                XMLUtils.createDocumentBuilder(false).parse(new ByteArrayInputStream(baos.toByteArray()));
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_KeyName.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_KeyName.getLocalPart());
         assertEquals(1, nodeList.getLength());
@@ -1587,7 +1578,7 @@
     public void testSignatureCreationWithoutOmittedDefaultTransform() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
         properties.setSignatureKeyIdentifier(SecurityTokenConstants.KeyIdentifier_KeyName);
@@ -1628,7 +1619,7 @@
 
         //System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document =
-                XMLUtils.read(new ByteArrayInputStream(baos.toByteArray()), false);
+                XMLUtils.createDocumentBuilder(false).parse(new ByteArrayInputStream(baos.toByteArray()));
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_KeyName.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_KeyName.getLocalPart());
         assertEquals(1, nodeList.getLength());
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestCreationTest.java
index 8b6905e..7fbe11d 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestCreationTest.java
@@ -46,11 +46,10 @@
 import org.apache.xml.security.stax.ext.XMLSecurityProperties;
 import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-
 /**
  * A set of test-cases for Signature creation with various digest algorithms
  */
@@ -88,7 +87,7 @@
     public void testSHA1() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -127,13 +126,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -143,7 +142,7 @@
     public void testSHA224() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -182,13 +181,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -198,7 +197,7 @@
     public void testSHA256() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -237,13 +236,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -253,7 +252,7 @@
     public void testSHA384() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -292,13 +291,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -308,7 +307,7 @@
     public void testSHA512() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -347,13 +346,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -365,7 +364,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -404,13 +403,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -422,7 +421,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -461,13 +460,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -479,7 +478,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -518,13 +517,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -536,7 +535,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -575,13 +574,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -593,7 +592,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -632,13 +631,13 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -650,7 +649,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -689,16 +688,16 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         NodeList nodeList = document.getElementsByTagNameNS(XMLSecurityConstants.TAG_dsig_DigestMethod.getNamespaceURI(), XMLSecurityConstants.TAG_dsig_DigestMethod.getLocalPart());
-        assertEquals(1, nodeList.getLength());
+        Assert.assertEquals(1, nodeList.getLength());
         Element element = (Element)nodeList.item(0);
-        assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
+        Assert.assertEquals(digestAlgorithm, element.getAttribute(XMLSecurityConstants.ATT_NULL_Algorithm.getLocalPart()));
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestVerificationTest.java
index 7b12f5c..a7cf0d3 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureDigestVerificationTest.java
@@ -27,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -70,7 +71,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -112,7 +114,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -121,7 +123,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -163,7 +166,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -172,7 +175,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -214,7 +218,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -223,7 +227,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -265,7 +270,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -274,7 +279,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -316,7 +322,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -327,7 +333,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -369,7 +376,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -380,7 +387,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -422,7 +430,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -433,7 +441,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -475,7 +484,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -486,7 +495,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -528,7 +538,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -539,7 +549,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -581,7 +592,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -592,7 +603,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -634,7 +646,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
 
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureEncryptionTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureEncryptionTest.java
index 3b29d9b..d013c31 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureEncryptionTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureEncryptionTest.java
@@ -18,6 +18,25 @@
  */
 package org.apache.xml.security.test.stax.signature;
 
+import org.apache.xml.security.encryption.XMLCipher;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
+import org.apache.xml.security.test.stax.utils.StAX2DOM;
+import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
+import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESedeKeySpec;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
@@ -29,35 +48,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.DESedeKeySpec;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import org.apache.xml.security.encryption.XMLCipher;
-import org.apache.xml.security.stax.ext.InboundXMLSec;
-import org.apache.xml.security.stax.ext.OutboundXMLSec;
-import org.apache.xml.security.stax.ext.SecurePart;
-import org.apache.xml.security.stax.ext.XMLSec;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
-import org.apache.xml.security.test.stax.utils.StAX2DOM;
-import org.apache.xml.security.test.stax.utils.XmlReaderToWriter;
-import org.apache.xml.security.utils.XMLUtils;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 /**
  * A set of test-cases for Signature + Encryption.
  */
@@ -67,7 +57,7 @@
     public void testSignatureEncryption() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
@@ -111,7 +101,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Decrypt using DOM API
@@ -120,7 +110,7 @@
 
         // Check the CreditCard decrypted ok
         NodeList nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -128,15 +118,15 @@
         TestSecurityEventListener testSecurityEventListener =
                 verifyUsingStAX(baos.toByteArray(), encryptionKey, cert.getPublicKey());
 
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
     }
 
     @Test
     public void testSignatureEncryptionSameElement() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
@@ -180,7 +170,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Decrypt using DOM API
@@ -189,7 +179,7 @@
 
         // Check the CreditCard decrypted ok
         NodeList nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -197,15 +187,15 @@
         TestSecurityEventListener testSecurityEventListener =
                 verifyUsingStAX(baos.toByteArray(), encryptionKey, cert.getPublicKey());
 
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.EncryptedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.EncryptedElement).size());
     }
 
     @Test
     public void testEnvelopedSignatureEncryptionElement() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
@@ -257,7 +247,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Decrypt using DOM API
@@ -266,7 +256,7 @@
 
         // Check the CreditCard decrypted ok
         NodeList nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -274,15 +264,15 @@
         TestSecurityEventListener testSecurityEventListener =
                 verifyUsingStAX(baos.toByteArray(), encryptionKey, cert.getPublicKey());
 
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.EncryptedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.EncryptedElement).size());
     }
 
     @Test
     public void testEnvelopedSignatureEncryptionContent() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         actions.add(XMLSecurityConstants.ENCRYPT);
         properties.setActions(actions);
@@ -334,7 +324,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Decrypt using DOM API
@@ -343,7 +333,7 @@
 
         // Check the CreditCard decrypted ok
         NodeList nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         // Verify using DOM
         verifyUsingDOM(document, cert, properties.getSignatureSecureParts());
@@ -351,15 +341,15 @@
         TestSecurityEventListener testSecurityEventListener =
                 verifyUsingStAX(baos.toByteArray(), encryptionKey, cert.getPublicKey());
 
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
     }
 
     @Test
     public void testEncryptionSignature() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.ENCRYPT);
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
@@ -411,7 +401,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -423,13 +413,13 @@
 
         // Check the CreditCard decrypted ok
         NodeList nodeList = doc.getElementsByTagNameNS("urn:example:po", "CreditCard");
-        assertEquals(nodeList.getLength(), 1);
+        Assert.assertEquals(nodeList.getLength(), 1);
 
         TestSecurityEventListener testSecurityEventListener =
                 verifyUsingStAX(baos.toByteArray(), encryptionKey, cert.getPublicKey());
 
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
-        assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement).size());
+        Assert.assertEquals(1, testSecurityEventListener.getSecurityEvents(SecurityEventConstants.ContentEncrypted).size());
     }
 
     @Test
@@ -451,9 +441,9 @@
 
         try {
             verifyUsingStAX(sourceDocument, encryptionKey, cert.getPublicKey());
-            fail("Exception expected");
+            Assert.fail("Exception expected");
         } catch (XMLStreamException e) {
-            assertEquals("Unsecured message. Neither a Signature nor a EncryptedData element found.",
+            Assert.assertEquals("Unsecured message. Neither a Signature nor a EncryptedData element found.",
                     e.getCause().getMessage());
         }
     }
@@ -513,13 +503,13 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, testSecurityEventListener);
 
-        Document document = StAX2DOM.readDoc(securityStreamReader);
+        Document document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // javax.xml.transform.Transformer transformer = TransformerFactory.newInstance().newTransformer();
         // transformer.transform(new DOMSource(document), new StreamResult(System.out));
 
         NodeList nodeList = document.getElementsByTagNameNS("http://www.w3.org/2001/04/xmlenc#", "EncryptedData");
-        assertEquals(nodeList.getLength(), 0);
+        Assert.assertEquals(nodeList.getLength(), 0);
 
         return testSecurityEventListener;
     }
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACCreationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACCreationTest.java
index c6ede30..18ba243 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACCreationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACCreationTest.java
@@ -83,7 +83,7 @@
     public void testHMACSHA1() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -117,7 +117,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -128,7 +128,7 @@
     public void testHMACSHA_224() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -162,7 +162,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -173,7 +173,7 @@
     public void testHMACSHA_256() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -207,7 +207,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -218,7 +218,7 @@
     public void testHMACSHA_384() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -252,7 +252,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -263,7 +263,7 @@
     public void testHMACSHA_512() throws Exception {
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -297,7 +297,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
@@ -310,7 +310,7 @@
 
         // Set up the Configuration
         XMLSecurityProperties properties = new XMLSecurityProperties();
-        List<XMLSecurityConstants.Action> actions = new ArrayList<>();
+        List<XMLSecurityConstants.Action> actions = new ArrayList<XMLSecurityConstants.Action>();
         actions.add(XMLSecurityConstants.SIGNATURE);
         properties.setActions(actions);
 
@@ -344,7 +344,7 @@
         // System.out.println("Got:\n" + new String(baos.toByteArray(), StandardCharsets.UTF_8.name()));
         Document document = null;
         try (InputStream is = new ByteArrayInputStream(baos.toByteArray())) {
-            document = XMLUtils.read(is, false);
+            document = XMLUtils.createDocumentBuilder(false).parse(is);
         }
 
         // Verify using DOM
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACVerificationTest.java
index 72aefa2..8b83ff4 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureHMACVerificationTest.java
@@ -30,6 +30,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.TransformerFactory;
@@ -98,7 +99,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -134,7 +136,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -143,7 +145,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -179,7 +182,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -188,7 +191,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -224,7 +228,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -233,7 +237,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -269,7 +274,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -278,7 +283,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -314,7 +320,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -325,7 +331,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set the key up
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -361,7 +368,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationReferenceURIResolverTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationReferenceURIResolverTest.java
index f28a93a..8a5efad 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationReferenceURIResolverTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationReferenceURIResolverTest.java
@@ -31,6 +31,7 @@
 import java.util.List;
 import java.util.UUID;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
@@ -49,12 +50,11 @@
 import org.apache.xml.security.test.stax.utils.TestUtils;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.implementations.ResolverDirectHTTP;
+import org.junit.Assert;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import static org.junit.Assert.assertNotNull;
-
 /**
  */
 public class SignatureVerificationReferenceURIResolverTest extends AbstractSignatureVerificationTest {
@@ -65,7 +65,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -121,7 +122,7 @@
 
         try {
             TestUtils.switchAllowNotSameDocumentReferences(true);
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
         }
@@ -133,7 +134,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -190,7 +192,7 @@
 
         try {
             TestUtils.switchAllowNotSameDocumentReferences(true);
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
         }
@@ -214,7 +216,8 @@
             InputStream sourceDocument =
                     this.getClass().getClassLoader().getResourceAsStream(
                             "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-            Document document = XMLUtils.read(sourceDocument, false);
+            DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+            Document document = builder.parse(sourceDocument);
 
             // Set up the Key
             KeyStore keyStore = KeyStore.getInstance("jks");
@@ -267,7 +270,7 @@
             InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
             XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowNotSameDocumentReferences(false);
             HttpRequestRedirectorProxy.stopHttpEngine();
@@ -280,7 +283,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -298,7 +302,7 @@
         String expression = "//*[local-name()='ShippingAddress']";
         Element elementToSign =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(elementToSign);
+        Assert.assertNotNull(elementToSign);
         String id = UUID.randomUUID().toString();
         elementToSign.setAttributeNS(null, "Id", id);
         elementToSign.setIdAttributeNS(null, "Id", true);
@@ -344,7 +348,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -353,7 +357,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -371,7 +376,7 @@
         String expression = "//*[local-name()='ShippingAddress']";
         Element elementToSign =
                 (Element) xpath.evaluate(expression, document, XPathConstants.NODE);
-        assertNotNull(elementToSign);
+        Assert.assertNotNull(elementToSign);
         String id = UUID.randomUUID().toString();
         elementToSign.setAttributeNS(null, "Id", id);
         elementToSign.setIdAttributeNS(null, "Id", true);
@@ -417,7 +422,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -426,7 +431,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -482,6 +488,6 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationTest.java
index 30e5f55..ff95450 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/SignatureVerificationTest.java
@@ -33,6 +33,7 @@
 
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -40,9 +41,6 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
 import org.apache.xml.security.c14n.Canonicalizer;
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315OmitComments;
 import org.apache.xml.security.exceptions.XMLSecurityException;
@@ -53,16 +51,8 @@
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.stax.config.Init;
 import org.apache.xml.security.stax.config.TransformerAlgorithmMapper;
-import org.apache.xml.security.stax.ext.InboundXMLSec;
-import org.apache.xml.security.stax.ext.XMLSec;
-import org.apache.xml.security.stax.ext.XMLSecurityConstants;
-import org.apache.xml.security.stax.ext.XMLSecurityProperties;
-import org.apache.xml.security.stax.securityEvent.KeyNameTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.KeyValueTokenSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SecurityEvent;
-import org.apache.xml.security.stax.securityEvent.SecurityEventConstants;
-import org.apache.xml.security.stax.securityEvent.SignedElementSecurityEvent;
-import org.apache.xml.security.stax.securityEvent.X509TokenSecurityEvent;
+import org.apache.xml.security.stax.ext.*;
+import org.apache.xml.security.stax.securityEvent.*;
 import org.apache.xml.security.stax.securityToken.SecurityTokenConstants;
 import org.apache.xml.security.test.stax.utils.StAX2DOM;
 import org.apache.xml.security.test.stax.utils.TestUtils;
@@ -70,14 +60,11 @@
 import org.apache.xml.security.transforms.Transform;
 import org.apache.xml.security.transforms.implementations.TransformC14N;
 import org.apache.xml.security.utils.XMLUtils;
-
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 /**
  * A set of test-cases for Signature verification.
@@ -104,7 +91,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -144,7 +132,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -170,9 +158,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -182,7 +170,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -223,7 +212,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -232,7 +221,7 @@
                             SecurityTokenConstants.KeyIdentifier_X509KeyIdentifier);
 
         List<SignedElementSecurityEvent> signedElementSecurityEventList = securityEventListener.getSecurityEvents(SecurityEventConstants.SignedElement);
-        assertEquals(2, signedElementSecurityEventList.size());
+        Assert.assertEquals(2, signedElementSecurityEventList.size());
         X509TokenSecurityEvent x509TokenSecurityEvent = securityEventListener.getSecurityEvent(SecurityEventConstants.X509Token);
         String signedElementCorrelationID1 = signedElementSecurityEventList.get(0).getCorrelationID();
         String signedElementCorrelationID2 = signedElementSecurityEventList.get(1).getCorrelationID();
@@ -254,10 +243,10 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents1.size());
-        assertEquals(3, signedElementSecurityEvents2.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents1.size());
+        Assert.assertEquals(3, signedElementSecurityEvents2.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents1.size() + signedElementSecurityEvents2.size());
     }
 
@@ -267,7 +256,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -317,9 +307,9 @@
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } catch (XMLStreamException ex) {
-            assertEquals("Multiple signatures are not supported.", ex.getCause().getMessage());
+            Assert.assertEquals("Multiple signatures are not supported.", ex.getCause().getMessage());
         }
     }
 
@@ -329,7 +319,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -382,7 +373,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
 
@@ -392,7 +383,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -430,7 +422,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener,
@@ -459,9 +451,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -471,7 +463,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         byte[] hmacKey = "secret".getBytes(StandardCharsets.US_ASCII);
@@ -511,11 +504,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a bad key");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
     }
 
@@ -537,7 +530,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -578,7 +572,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener,
@@ -607,9 +601,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -619,7 +613,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -660,7 +655,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener,
@@ -689,9 +684,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -701,7 +696,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -742,7 +738,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener,
@@ -771,9 +767,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -783,7 +779,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -824,7 +821,7 @@
         XMLStreamReader securityStreamReader =
             inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener,
@@ -853,9 +850,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -865,7 +862,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -911,7 +909,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -937,9 +935,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -949,7 +947,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -993,7 +992,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -1019,9 +1018,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -1039,7 +1038,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("JCEKS");
@@ -1083,7 +1083,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -1109,9 +1109,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -1121,7 +1121,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1162,7 +1163,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // Check the SecurityEvents
         checkSecurityEvents(securityEventListener);
@@ -1188,9 +1189,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -1200,7 +1201,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext-base64.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1241,7 +1243,7 @@
         XMLStreamReader securityStreamReader =
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         SignedElementSecurityEvent signedElementSecurityEvent = securityEventListener.getSecurityEvent(SecurityEventConstants.SignedElement);
         X509TokenSecurityEvent x509TokenSecurityEvent = securityEventListener.getSecurityEvent(SecurityEventConstants.X509Token);
@@ -1261,9 +1263,9 @@
             }
         }
 
-        assertEquals(4, signatureSecurityEvents.size());
-        assertEquals(3, signedElementSecurityEvents.size());
-        assertEquals(securityEventListener.getSecurityEvents().size(),
+        Assert.assertEquals(4, signatureSecurityEvents.size());
+        Assert.assertEquals(3, signedElementSecurityEvents.size());
+        Assert.assertEquals(securityEventListener.getSecurityEvents().size(),
                 signatureSecurityEvents.size() + signedElementSecurityEvents.size());
     }
 
@@ -1273,7 +1275,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1316,7 +1319,7 @@
         int oldval = 0;
         try {
             oldval = TestUtils.changeValueOfMaximumAllowedReferencesPerManifest(2);
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Exception expected");
         } catch (XMLStreamException e) {
             assertTrue(e.getCause() instanceof XMLSecurityException);
@@ -1334,7 +1337,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1375,7 +1379,7 @@
         int oldval = 0;
         try {
             oldval = TestUtils.changeValueOfMaximumAllowedTransformsPerReference(0);
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Exception expected");
         } catch (XMLStreamException e) {
             assertTrue(e.getCause() instanceof XMLSecurityException);
@@ -1393,7 +1397,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1432,7 +1437,7 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Exception expected");
         } catch (XMLStreamException e) {
             assertTrue(e.getCause() instanceof XMLSecurityException);
@@ -1455,7 +1460,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1495,7 +1501,7 @@
 
         try {
             TestUtils.switchAllowMD5Algorithm(true);
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
         } finally {
             TestUtils.switchAllowMD5Algorithm(false);
         }
@@ -1514,7 +1520,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1555,7 +1562,7 @@
         int oldval = 0;
         try {
             oldval = TestUtils.changeValueOfMaximumAllowedXMLStructureDepth(5);
-            document = StAX2DOM.readDoc(securityStreamReader);
+            document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Exception expected");
         } catch (XMLStreamException e) {
             assertTrue(e.getCause() instanceof XMLSecurityException);
@@ -1584,7 +1591,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1625,7 +1633,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        StAX2DOM.readDoc(securityStreamReader);
+        StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
     }
 
     @Test
@@ -1634,7 +1642,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1678,10 +1687,10 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a modified document");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getMessage().contains("Invalid digest of reference"));
+            Assert.assertTrue(ex.getMessage().contains("Invalid digest of reference"));
         }
     }
 
@@ -1691,7 +1700,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1742,10 +1752,10 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a modified document");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getMessage().contains("Invalid digest of reference"));
+            Assert.assertTrue(ex.getMessage().contains("Invalid digest of reference"));
         }
     }
 
@@ -1755,7 +1765,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1812,10 +1823,10 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a modified document");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getMessage().contains("Invalid digest of reference"));
+            Assert.assertTrue(ex.getMessage().contains("Invalid digest of reference"));
         }
     }
 
@@ -1825,7 +1836,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -1889,10 +1901,10 @@
                 inboundXMLSec.processInMessage(xmlStreamReader, null, securityEventListener);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a modified document");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getMessage().contains("Invalid digest of reference"));
+            Assert.assertTrue(ex.getMessage().contains("Invalid digest of reference"));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/TestSecurityEventListener.java b/src/test/java/org/apache/xml/security/test/stax/signature/TestSecurityEventListener.java
index ff46e86..d55dacf 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/TestSecurityEventListener.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/TestSecurityEventListener.java
@@ -25,9 +25,7 @@
 import org.apache.xml.security.stax.securityEvent.SecurityEvent;
 import org.apache.xml.security.stax.securityEvent.SecurityEventConstants.Event;
 import org.apache.xml.security.stax.securityEvent.SecurityEventListener;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.Assert;
 
 public class TestSecurityEventListener implements SecurityEventListener {
     private List<SecurityEvent> events = new ArrayList<>();
@@ -36,8 +34,8 @@
     public void registerSecurityEvent(SecurityEvent securityEvent)
             throws XMLSecurityException {
 
-        assertNotNull("CorrelationID of SecurityEvent is null: " + securityEvent.getSecurityEventType(), securityEvent.getCorrelationID());
-        assertTrue("CorrelationID of SecurityEvent is empty: " + securityEvent.getSecurityEventType(), securityEvent.getCorrelationID().length() > 0);
+        Assert.assertNotNull("CorrelationID of SecurityEvent is null: " + securityEvent.getSecurityEventType(), securityEvent.getCorrelationID());
+        Assert.assertTrue("CorrelationID of SecurityEvent is empty: " + securityEvent.getSecurityEventType(), securityEvent.getCorrelationID().length() > 0);
         events.add(securityEvent);
     }
 
diff --git a/src/test/java/org/apache/xml/security/test/stax/signature/UnknownAlgoSignatureTest.java b/src/test/java/org/apache/xml/security/test/stax/signature/UnknownAlgoSignatureTest.java
index 5cf5830..d11edd0 100644
--- a/src/test/java/org/apache/xml/security/test/stax/signature/UnknownAlgoSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/signature/UnknownAlgoSignatureTest.java
@@ -24,6 +24,7 @@
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -39,15 +40,11 @@
 import org.apache.xml.security.test.stax.utils.StAX2DOM;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
 import org.apache.xml.security.utils.XMLUtils;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-
 /**
  * Tests cases where signature algorithms are unknown.
  * <p>
@@ -55,7 +52,7 @@
  * org.apache.xml.security.samples.signature.CreateEnvelopingSignature</code>
  * </p>
  */
-public class UnknownAlgoSignatureTest {
+public class UnknownAlgoSignatureTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
     private TransformerFactory transformerFactory = TransformerFactory.newInstance();
@@ -77,7 +74,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "org/apache/xml/security/temp/signature/signature-good.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -102,7 +100,7 @@
         InboundXMLSec inboundXMLSec = XMLSec.getInboundWSSec(properties);
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
-        document = StAX2DOM.readDoc(securityStreamReader);
+        document = StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
 
         // XMLUtils.outputDOM(document, System.out);
     }
@@ -113,7 +111,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "org/apache/xml/security/temp/signature/signature-bad-c14n-algo.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -142,11 +141,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a bad c14n algorithm");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("Unknown transformation. No handler installed for URI http://www.apache.org/bad-c14n-algo", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("Unknown transformation. No handler installed for URI http://www.apache.org/bad-c14n-algo", ex.getCause().getMessage());
         }
 
         // XMLUtils.outputDOM(document, System.out);
@@ -158,7 +157,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "org/apache/xml/security/temp/signature/signature-bad-sig-algo.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -187,11 +187,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a bad signature algorithm");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("The algorithm URI \"http://www.apache.org/bad-sig-algo\" could not be mapped to a JCE algorithm",
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("The algorithm URI \"http://www.apache.org/bad-sig-algo\" could not be mapped to a JCE algorithm",
                     ex.getCause().getMessage());
         }
 
@@ -204,7 +204,8 @@
         InputStream sourceDocument =
                 this.getClass().getClassLoader().getResourceAsStream(
                         "org/apache/xml/security/temp/signature/signature-bad-transform-algo.xml");
-        Document document = XMLUtils.read(sourceDocument, false);
+        DocumentBuilder builder = XMLUtils.createDocumentBuilder(false);
+        Document document = builder.parse(sourceDocument);
 
         // Set up the Key
         KeyStore keyStore = KeyStore.getInstance("jks");
@@ -233,11 +234,11 @@
         XMLStreamReader securityStreamReader = inboundXMLSec.processInMessage(xmlStreamReader);
 
         try {
-            StAX2DOM.readDoc(securityStreamReader);
+            StAX2DOM.readDoc(XMLUtils.createDocumentBuilder(false), securityStreamReader);
             fail("Failure expected on a bad transform algorithm");
         } catch (XMLStreamException ex) {
-            assertTrue(ex.getCause() instanceof XMLSecurityException);
-            assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
+            Assert.assertTrue(ex.getCause() instanceof XMLSecurityException);
+            Assert.assertEquals("INVALID signature -- core validation failed.", ex.getCause().getMessage());
         }
 
         // XMLUtils.outputDOM(document, System.out);
diff --git a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformBase64DecodeTest.java b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformBase64DecodeTest.java
index 01b42a9..7a5c308 100644
--- a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformBase64DecodeTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformBase64DecodeTest.java
@@ -26,6 +26,7 @@
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.impl.transformer.TransformBase64Decode;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -42,12 +43,9 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 /**
  */
-public class TransformBase64DecodeTest {
+public class TransformBase64DecodeTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
 
@@ -90,7 +88,7 @@
 
             @Override
             public void transform(InputStream inputStream) throws XMLStreamException {
-                fail("unexpected call to transform(InputStream");
+                Assert.fail("unexpected call to transform(InputStream");
             }
 
             @Override
@@ -121,7 +119,7 @@
 
         transformBase64Decode.doFinal();
 
-        assertEquals(16, xmlSecEvents.size());
+        Assert.assertEquals(16, xmlSecEvents.size());
     }
 
     @Test
@@ -150,7 +148,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -190,7 +188,7 @@
 
         transformBase64Decode.doFinal();
 
-        assertEquals(153, byteArrayOutputStream.size());
+        Assert.assertEquals(153, byteArrayOutputStream.size());
     }
 
     @Test
@@ -221,7 +219,7 @@
 
         transformBase64Decode.doFinal();
 
-        assertEquals(153, byteArrayOutputStream.size());
+        Assert.assertEquals(153, byteArrayOutputStream.size());
     }
 
     @Test
@@ -233,7 +231,7 @@
         transformBase64Decode.transform(this.getClass().getClassLoader().getResourceAsStream(
                 "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/xml-stylesheet.b64"));
 
-        assertEquals(13132, byteArrayOutputStream.size());
+        Assert.assertEquals(13132, byteArrayOutputStream.size());
     }
 
     @Test
@@ -266,7 +264,7 @@
 
             @Override
             public void transform(InputStream inputStream) throws XMLStreamException {
-                fail("unexpected call to transform(InputStream");
+                Assert.fail("unexpected call to transform(InputStream");
             }
 
             @Override
@@ -281,7 +279,7 @@
 
         transformBase64Decode.doFinal();
 
-        assertEquals(44, xmlSecEvents.size());
+        Assert.assertEquals(44, xmlSecEvents.size());
     }
 
     @Test
@@ -309,7 +307,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -333,6 +331,6 @@
 
         transformBase64Decode.doFinal();
 
-        assertEquals(615, byteArrayOutputStream.size());
+        Assert.assertEquals(615, byteArrayOutputStream.size());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformCanonicalizerTest.java b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformCanonicalizerTest.java
index 50a5828..953ddd0 100644
--- a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformCanonicalizerTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformCanonicalizerTest.java
@@ -26,6 +26,7 @@
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.impl.transformer.canonicalizer.Canonicalizer20010315_OmitCommentsTransformer;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,12 +40,9 @@
 import java.io.OutputStream;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 /**
  */
-public class TransformCanonicalizerTest {
+public class TransformCanonicalizerTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
 
@@ -82,7 +80,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -112,7 +110,7 @@
 
         canonicalizerTransformer.doFinal();
 
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 
     @Test
@@ -141,7 +139,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -171,7 +169,7 @@
 
         canonicalizerTransformer.doFinal();
 
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 
     @Test
@@ -191,7 +189,7 @@
         }
 
         canonicalizerTransformer.doFinal();
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 
     @Test
@@ -203,7 +201,7 @@
         canonicalizerTransformer.transform(this.getClass().getClassLoader().getResourceAsStream(
                 "ie/baltimore/merlin-examples/merlin-xmlenc-five/plaintext-base64.xml"));
 
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 
     @Test
@@ -231,7 +229,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -255,7 +253,7 @@
 
         canonicalizerTransformer.doFinal();
 
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 
     @Test
@@ -283,7 +281,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -307,6 +305,6 @@
 
         canonicalizerTransformer.doFinal();
 
-        assertEquals(554, byteArrayOutputStream.size());
+        Assert.assertEquals(554, byteArrayOutputStream.size());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformEnvelopedSignatureTest.java b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformEnvelopedSignatureTest.java
index dd2feda..bfdfe5d 100644
--- a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformEnvelopedSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformEnvelopedSignatureTest.java
@@ -26,6 +26,7 @@
 import org.apache.xml.security.stax.ext.stax.XMLSecEvent;
 import org.apache.xml.security.stax.impl.transformer.TransformEnvelopedSignature;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -41,12 +42,9 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 /**
  */
-public class TransformEnvelopedSignatureTest {
+public class TransformEnvelopedSignatureTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
 
@@ -89,7 +87,7 @@
 
             @Override
             public void transform(InputStream inputStream) throws XMLStreamException {
-                fail("unexpected call to transform(InputStream");
+                Assert.fail("unexpected call to transform(InputStream");
             }
 
             @Override
@@ -110,7 +108,7 @@
 
         transformEnvelopedSignature.doFinal();
 
-        assertEquals(19, xmlSecEvents.size());
+        Assert.assertEquals(19, xmlSecEvents.size());
     }
 
     @Test
@@ -139,7 +137,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -169,7 +167,7 @@
 
         transformEnvelopedSignature.doFinal();
 
-        assertEquals(207, byteArrayOutputStream.size());
+        Assert.assertEquals(207, byteArrayOutputStream.size());
     }
 
     @Test
@@ -190,6 +188,6 @@
 
         transformEnvelopedSignature.doFinal();
 
-        assertEquals(207, byteArrayOutputStream.size());
+        Assert.assertEquals(207, byteArrayOutputStream.size());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformIdentityTest.java b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformIdentityTest.java
index b0b5328..94aa8fe 100644
--- a/src/test/java/org/apache/xml/security/test/stax/transformer/TransformIdentityTest.java
+++ b/src/test/java/org/apache/xml/security/test/stax/transformer/TransformIdentityTest.java
@@ -27,6 +27,7 @@
 import org.apache.xml.security.stax.impl.transformer.TransformIdentity;
 import org.apache.xml.security.test.stax.utils.UnixInputStream;
 import org.apache.xml.security.test.stax.utils.XMLSecEventAllocator;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -43,12 +44,9 @@
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 /**
  */
-public class TransformIdentityTest {
+public class TransformIdentityTest extends Assert {
 
     private XMLInputFactory xmlInputFactory;
 
@@ -92,7 +90,7 @@
 
             @Override
             public void transform(InputStream inputStream) throws XMLStreamException {
-                fail("unexpected call to transform(InputStream");
+                Assert.fail("unexpected call to transform(InputStream");
             }
 
             @Override
@@ -123,7 +121,7 @@
 
         transformIdentity.doFinal();
 
-        assertEquals(3, xmlSecEvents.size());
+        Assert.assertEquals(3, xmlSecEvents.size());
     }
 
     @Test
@@ -152,7 +150,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -192,7 +190,7 @@
 
         transformIdentity.doFinal();
 
-        assertEquals(255, byteArrayOutputStream.size());
+        Assert.assertEquals(255, byteArrayOutputStream.size());
     }
 
     @Test
@@ -223,7 +221,7 @@
 
         transformIdentity.doFinal();
 
-        assertEquals(255, byteArrayOutputStream.size());
+        Assert.assertEquals(255, byteArrayOutputStream.size());
     }
 
     @Test
@@ -235,7 +233,7 @@
         transformIdentity.transform(new UnixInputStream(this.getClass().getClassLoader().getResourceAsStream(
                 "ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/xml-stylesheet.b64")));
 
-        assertEquals(17786, byteArrayOutputStream.size());
+        Assert.assertEquals(17786, byteArrayOutputStream.size());
     }
 
     @Test
@@ -268,7 +266,7 @@
 
             @Override
             public void transform(InputStream inputStream) throws XMLStreamException {
-                fail("unexpected call to transform(InputStream");
+                Assert.fail("unexpected call to transform(InputStream");
             }
 
             @Override
@@ -283,7 +281,7 @@
 
         transformIdentity.doFinal();
 
-        assertEquals(25, xmlSecEvents.size());
+        Assert.assertEquals(25, xmlSecEvents.size());
     }
 
     @Test
@@ -311,7 +309,7 @@
 
             @Override
             public void transform(XMLSecEvent xmlSecEvent) throws XMLStreamException {
-                fail("unexpected call to transform(XMLSecEvent");
+                Assert.fail("unexpected call to transform(XMLSecEvent");
             }
 
             @Override
@@ -335,6 +333,6 @@
 
         transformIdentity.doFinal();
 
-        assertEquals(831, byteArrayOutputStream.size());
+        Assert.assertEquals(831, byteArrayOutputStream.size());
     }
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/utils/KeyLoader.java b/src/test/java/org/apache/xml/security/test/stax/utils/KeyLoader.java
index b49caba..c0763ec 100644
--- a/src/test/java/org/apache/xml/security/test/stax/utils/KeyLoader.java
+++ b/src/test/java/org/apache/xml/security/test/stax/utils/KeyLoader.java
@@ -18,6 +18,8 @@
  */
 package org.apache.xml.security.test.stax.utils;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
 import java.io.FileInputStream;
 import java.security.KeyFactory;
 import java.security.PublicKey;
@@ -32,6 +34,16 @@
     private static final String BASEDIR = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
 
+    private static DocumentBuilder documentBuilder;
+
+    static {
+        try {
+            documentBuilder = XMLUtils.createDocumentBuilder(false);
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     private static String getControlFilePath(String fileName) {
         return BASEDIR + SEP + "src" + SEP + "test" + SEP + "resources" +
                 SEP + "org" + SEP + "apache" + SEP + "xml" + SEP + "security" +
@@ -48,7 +60,7 @@
     }
 
     public static Document loadXML(String fileName) throws Exception {
-        return XMLUtils.read(new FileInputStream(getControlFilePath(fileName)), false);
+        return documentBuilder.parse(new FileInputStream(getControlFilePath(fileName)));
     }
 
 }
diff --git a/src/test/java/org/apache/xml/security/test/stax/utils/StAX2DOM.java b/src/test/java/org/apache/xml/security/test/stax/utils/StAX2DOM.java
index cf6cf7b..bc0fd9a 100644
--- a/src/test/java/org/apache/xml/security/test/stax/utils/StAX2DOM.java
+++ b/src/test/java/org/apache/xml/security/test/stax/utils/StAX2DOM.java
@@ -18,10 +18,9 @@
  */
 package org.apache.xml.security.test.stax.utils;
 
-import org.apache.xml.security.utils.XMLUtils;
 import org.w3c.dom.*;
 
-import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.stream.Location;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
@@ -32,11 +31,11 @@
 public class StAX2DOM {
     static final String XML_NS = "http://www.w3.org/2000/xmlns/";
 
-    public static Document readDoc(XMLStreamReader xmlStreamReader) throws XMLStreamException, ParserConfigurationException {
+    public static Document readDoc(DocumentBuilder documentBuilder, XMLStreamReader xmlStreamReader) throws XMLStreamException {
         //skip possible text at the beginning of a document and go directly to the root tag
         while (xmlStreamReader.hasNext() && xmlStreamReader.next() != XMLStreamConstants.START_ELEMENT) {       //NOPMD
         }
-        Document document = XMLUtils.newDocument();
+        Document document = documentBuilder.newDocument();
         StAX2DOM.readDocElements(document, document, xmlStreamReader, false, false);
         xmlStreamReader.close();
         return document;
diff --git a/src/test/java/org/apache/xml/security/test/stax/utils/XMLSecEventAllocator.java b/src/test/java/org/apache/xml/security/test/stax/utils/XMLSecEventAllocator.java
index cadc250..07b852c 100644
--- a/src/test/java/org/apache/xml/security/test/stax/utils/XMLSecEventAllocator.java
+++ b/src/test/java/org/apache/xml/security/test/stax/utils/XMLSecEventAllocator.java
@@ -36,9 +36,11 @@
  */
 public class XMLSecEventAllocator implements XMLEventAllocator {
 
+    private XMLEventAllocator xmlEventAllocator;
     private XMLSecStartElement parentXmlSecStartElement;
 
     public XMLSecEventAllocator() throws Exception {
+        xmlEventAllocator = com.ctc.wstx.evt.DefaultEventAllocator.getDefaultInstance();
     }
 
     @Override
@@ -53,16 +55,21 @@
     @Override
     public XMLEvent allocate(XMLStreamReader xmlStreamReader) throws XMLStreamException {
         XMLSecEvent xmlSecEvent = XMLSecEventFactory.allocate(xmlStreamReader, parentXmlSecStartElement);
-        if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType()) {
-            parentXmlSecStartElement = (XMLSecStartElement) xmlSecEvent;
-        } else if (XMLStreamConstants.START_ELEMENT == xmlSecEvent.getEventType() && parentXmlSecStartElement != null) {
-            parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
+        switch (xmlSecEvent.getEventType()) {
+            case XMLStreamConstants.START_ELEMENT:
+                parentXmlSecStartElement = (XMLSecStartElement) xmlSecEvent;
+                break;
+            case XMLStreamConstants.END_ELEMENT:
+                if (parentXmlSecStartElement != null) {
+                    parentXmlSecStartElement = parentXmlSecStartElement.getParentXMLSecStartElement();
+                }
+                break;
         }
         return xmlSecEvent;
     }
 
     @Override
     public void allocate(XMLStreamReader reader, XMLEventConsumer consumer) throws XMLStreamException {
-       // xmlEventAllocator.allocate(reader, consumer);
+        xmlEventAllocator.allocate(reader, consumer);
     }
 }
