diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyInfo.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyInfo.java
index 310a685..1330e34 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyInfo.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMKeyInfo.java
@@ -31,13 +31,13 @@ import javax.xml.crypto.dom.*;
 
 import java.security.Provider;
 import java.util.*;
+
+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 org.apache.xml.security.utils.IdResolver;
-
 /**
  * DOM-based implementation of KeyInfo.
  *
@@ -88,9 +88,12 @@ public final class DOMKeyInfo extends DOMStructure implements KeyInfo {
         throws MarshalException
     {
         // get Id attribute, if specified
-        id = DOMUtils.getAttributeValue(kiElem, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(kiElem, id);
+        Attr attr = kiElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            id = attr.getValue();
+            kiElem.setIdAttributeNode(attr, true);
+        } else {
+            id = null;
         }
 
         // get all children nodes
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMManifest.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMManifest.java
index 0621b13..5b32558 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMManifest.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMManifest.java
@@ -30,12 +30,12 @@ import javax.xml.crypto.dsig.*;
 
 import java.security.Provider;
 import java.util.*;
+
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import org.apache.xml.security.utils.IdResolver;
-
 /**
  * DOM-based implementation of Manifest.
  *
@@ -87,9 +87,12 @@ public final class DOMManifest extends DOMStructure implements Manifest {
                        Provider provider)
         throws MarshalException
     {
-        this.id = DOMUtils.getAttributeValue(manElem, "Id");
-        if (this.id != null) {
-            IdResolver.registerElementById(manElem, this.id);
+        Attr attr = manElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            this.id = attr.getValue();
+            manElem.setIdAttributeNode(attr, true);
+        } else {
+            this.id = null;
         }
         
         Boolean secureValidation = (Boolean)
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 469f705..2abcebc 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
@@ -51,7 +51,6 @@ import org.apache.xml.security.algorithms.MessageDigestAlgorithm;
 import org.apache.xml.security.exceptions.Base64DecodingException;
 import org.apache.xml.security.signature.XMLSignatureInput;
 import org.apache.xml.security.utils.Base64;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 
 /**
@@ -243,9 +242,13 @@ public final class DOMReference extends DOMStructure
 
         // unmarshal attributes
         this.uri = DOMUtils.getAttributeValue(refElem, "URI");
-        this.id = DOMUtils.getAttributeValue(refElem, "Id");
-        if (this.id != null) {
-            IdResolver.registerElementById(refElem, this.id);
+        
+        Attr attr = refElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            this.id = attr.getValue();
+            refElem.setIdAttributeNode(attr, true);
+        } else {
+            this.id = null;
         }
 
         this.type = DOMUtils.getAttributeValue(refElem, "Type");
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java
index 073458a..0e32f02 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java
@@ -29,13 +29,13 @@ import javax.xml.crypto.dom.DOMCryptoContext;
 import javax.xml.crypto.dsig.*;
 
 import java.util.*;
+
+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 org.apache.xml.security.utils.IdResolver;
-
 /**
  * DOM-based implementation of SignatureProperties.
  *
@@ -90,9 +90,12 @@ public final class DOMSignatureProperties extends DOMStructure
         throws MarshalException
     {
         // unmarshal attributes
-        id = DOMUtils.getAttributeValue(propsElem, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(propsElem, id);
+        Attr attr = propsElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            id = attr.getValue();
+            propsElem.setIdAttributeNode(attr, true);
+        } else {
+            id = null;
         }
 
         NodeList nodes = propsElem.getChildNodes();
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java
index c1ee298..d6be47f 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java
@@ -29,13 +29,13 @@ import javax.xml.crypto.dom.DOMCryptoContext;
 import javax.xml.crypto.dsig.*;
 
 import java.util.*;
+
+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 org.apache.xml.security.utils.IdResolver;
-
 /**
  * DOM-based implementation of SignatureProperty.
  *
@@ -98,9 +98,12 @@ public final class DOMSignatureProperty extends DOMStructure
         if (target == null) {
             throw new MarshalException("target cannot be null");
         }
-        id = DOMUtils.getAttributeValue(propElem, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(propElem, id);
+        Attr attr = propElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            id = attr.getValue();
+            propElem.setIdAttributeNode(attr, true);
+        } else {
+            id = null;
         }
 
         NodeList nodes = propElem.getChildNodes();
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java
index 61dc1d0..e15af85 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java
@@ -25,11 +25,9 @@
 package org.apache.jcp.xml.dsig.internal.dom;
 
 import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
 import org.apache.xml.security.Init;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolver;
 import org.apache.xml.security.signature.XMLSignatureInput;
 
@@ -65,8 +63,9 @@ public class DOMURIDereferencer implements URIDereferencer {
         Attr uriAttr = (Attr) domRef.getHere();
         String uri = uriRef.getURI();
         DOMCryptoContext dcc = (DOMCryptoContext) context;
-
-        // Check if same-document URI and register ID
+        String baseURI = context.getBaseURI();
+        
+        // Check if same-document URI and already registered on the context
         if (uri != null && uri.length() != 0 && uri.charAt(0) == '#') {
             String id = uri.substring(1);
 
@@ -76,12 +75,20 @@ public class DOMURIDereferencer implements URIDereferencer {
                 id = id.substring(i1+1, i2);
             }
 
-            // this is a bit of a hack to check for registered 
-            // IDRefs and manually register them with Apache's IdResolver 
-            // map which includes builtin schema knowledge of DSig/Enc IDs
             Node referencedElem = dcc.getElementById(id);
             if (referencedElem != null) {
-                IdResolver.registerElementById((Element) referencedElem, id);
+                XMLSignatureInput result = new XMLSignatureInput(referencedElem);
+                if (!uri.substring(1).startsWith("xpointer(id(")) {
+                    result.setExcludeComments(true);
+                }
+
+                result.setMIMEType("text/xml");
+                if (baseURI != null && baseURI.length() > 0) {
+                    result.setSourceURI(baseURI.concat(uriAttr.getNodeValue()));      
+                } else {
+                    result.setSourceURI(uriAttr.getNodeValue());      
+                }
+                return new ApacheNodeSetData(result);
             }
         } 
 
@@ -92,7 +99,6 @@ public class DOMURIDereferencer implements URIDereferencer {
             secVal = true;
         }
         try {
-            String baseURI = context.getBaseURI();
             ResourceResolver apacheResolver = 
                 ResourceResolver.getInstance(uriAttr, baseURI, secVal);
             XMLSignatureInput in = apacheResolver.resolve(uriAttr, baseURI);
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 7a3716a..f91e2ea 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
@@ -35,8 +35,6 @@ import javax.xml.crypto.*;
 import javax.xml.crypto.dsig.*;
 import javax.xml.crypto.dsig.spec.*;
 
-import org.apache.xml.security.utils.IdResolver;
-
 /**
  * Useful static DOM utility methods.
  *
@@ -105,7 +103,7 @@ public class DOMUtils {
     public static void setAttributeID(Element elem, String name, String value) {
         if (value == null) return;
         elem.setAttributeNS(null, name, value);
-        IdResolver.registerElementById(elem, value);
+        elem.setIdAttributeNS(null, name, true);
     }
 
     /**
diff --git a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLObject.java b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLObject.java
index 9019b75..9f8b5cb 100644
--- a/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLObject.java
+++ b/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMXMLObject.java
@@ -30,13 +30,13 @@ import javax.xml.crypto.dsig.*;
 
 import java.security.Provider;
 import java.util.*;
+
+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 org.apache.xml.security.utils.IdResolver;
-
 /**
  * DOM-based implementation of XMLObject.
  *
@@ -95,9 +95,13 @@ public final class DOMXMLObject extends DOMStructure implements XMLObject {
     {
         // unmarshal attributes
         this.encoding = DOMUtils.getAttributeValue(objElem, "Encoding");
-        this.id = DOMUtils.getAttributeValue(objElem, "Id");
-        if (this.id != null) {
-            IdResolver.registerElementById(objElem, this.id);
+        
+        Attr attr = objElem.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            this.id = attr.getValue();
+            objElem.setIdAttributeNode(attr, true);
+        } else {
+            this.id = null;
         }
         this.mimeType = DOMUtils.getAttributeValue(objElem, "MimeType");
 
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 f914c7a..0098049 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
@@ -45,13 +45,14 @@ import java.util.Collections;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
 import org.apache.xml.security.exceptions.Base64DecodingException;
 import org.apache.xml.security.utils.Base64;
-import org.apache.xml.security.utils.IdResolver;
 
 /**
  * DOM-based implementation of XMLSignature.
@@ -494,9 +495,12 @@ public final class DOMXMLSignature extends DOMStructure
                 throw new MarshalException(bde);
             }
 
-            id = DOMUtils.getAttributeValue(sigValueElem, "Id");
-            if (id != null) {
-                IdResolver.registerElementById(sigValueElem, id);
+            Attr attr = sigValueElem.getAttributeNodeNS(null, "Id");
+            if (attr != null) {
+                id = attr.getValue();
+                sigValueElem.setIdAttributeNode(attr, true);
+            } else {
+                id = null;
             }
             this.sigValueElem = sigValueElem;
         }
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 7bf026c..adc1c43 100644
--- a/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
+++ b/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
@@ -34,8 +34,7 @@ import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.signature.XMLSignatureException;
 import org.apache.xml.security.utils.ClassLoaderUtils;
 import org.apache.xml.security.utils.Constants;
-import org.apache.xml.security.utils.IdResolver;
-import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -121,9 +120,9 @@ public class SignatureAlgorithm extends Algorithm {
         super(element, BaseURI);      
         algorithmURI = this.getURI();
         
-        String id = XMLUtils.getAttributeValue(element, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(element, id);
+        Attr attr = element.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            element.setIdAttributeNode(attr, true);
         }
         
         if (secureValidation && (XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5.equals(algorithmURI)
diff --git a/src/main/java/org/apache/xml/security/keys/KeyInfo.java b/src/main/java/org/apache/xml/security/keys/KeyInfo.java
index 73bf4ee..4eea67e 100644
--- a/src/main/java/org/apache/xml/security/keys/KeyInfo.java
+++ b/src/main/java/org/apache/xml/security/keys/KeyInfo.java
@@ -47,9 +47,9 @@ import org.apache.xml.security.keys.storage.StorageResolver;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.EncryptionConstants;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -136,9 +136,9 @@ public class KeyInfo extends SignatureElementProxy {
     public KeyInfo(Element element, String BaseURI) throws XMLSecurityException {
         super(element, BaseURI);
         
-        String id = XMLUtils.getAttributeValue(element, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(element, id);
+        Attr attr = element.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            element.setIdAttributeNode(attr, true);
         }
     }
     
@@ -157,7 +157,7 @@ public class KeyInfo extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
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 923e9f1..34bab20 100644
--- a/src/main/java/org/apache/xml/security/signature/Manifest.java
+++ b/src/main/java/org/apache/xml/security/signature/Manifest.java
@@ -34,11 +34,11 @@ import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.I18n;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.ResourceResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
+import org.w3c.dom.Attr;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -112,9 +112,9 @@ public class Manifest extends SignatureElementProxy {
     ) throws XMLSecurityException {
         super(element, baseURI);
         
-        String id = XMLUtils.getAttributeValue(element, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(element, id);
+        Attr attr = element.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            element.setIdAttributeNode(attr, true);
         }
         this.secureValidation = secureValidation;
 
@@ -143,9 +143,9 @@ public class Manifest extends SignatureElementProxy {
 
         for (int i = 0; i < le; i++) {
             Element refElem = referencesEl[i];
-            String refId = XMLUtils.getAttributeValue(refElem, "Id");
-            if (refId != null) {
-                IdResolver.registerElementById(refElem, refId);
+            Attr refAttr = refElem.getAttributeNodeNS(null, "Id");
+            if (refAttr != null) {
+                refElem.setIdAttributeNode(refAttr, true);
             }
             this.references.add(null);
         }
@@ -244,7 +244,7 @@ public class Manifest extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/ObjectContainer.java b/src/main/java/org/apache/xml/security/signature/ObjectContainer.java
index 780f71f..5bda8f5 100644
--- a/src/main/java/org/apache/xml/security/signature/ObjectContainer.java
+++ b/src/main/java/org/apache/xml/security/signature/ObjectContainer.java
@@ -20,7 +20,6 @@ package org.apache.xml.security.signature;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.utils.Constants;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -64,7 +63,7 @@ public class ObjectContainer extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
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 cc53dc0..cd8e5de 100644
--- a/src/main/java/org/apache/xml/security/signature/Reference.java
+++ b/src/main/java/org/apache/xml/security/signature/Reference.java
@@ -38,7 +38,6 @@ import org.apache.xml.security.transforms.params.InclusiveNamespaces;
 import org.apache.xml.security.utils.Base64;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.DigesterOutputStream;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 import org.apache.xml.security.utils.XMLUtils;
@@ -293,7 +292,7 @@ public class Reference extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/SignatureProperties.java b/src/main/java/org/apache/xml/security/signature/SignatureProperties.java
index 47151e3..f297a57 100644
--- a/src/main/java/org/apache/xml/security/signature/SignatureProperties.java
+++ b/src/main/java/org/apache/xml/security/signature/SignatureProperties.java
@@ -20,9 +20,9 @@ package org.apache.xml.security.signature;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.utils.Constants;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.apache.xml.security.utils.XMLUtils;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -56,18 +56,18 @@ public class SignatureProperties extends SignatureElementProxy {
     public SignatureProperties(Element element, String BaseURI) throws XMLSecurityException {
         super(element, BaseURI);
         
-        String id = XMLUtils.getAttributeValue(element, "Id");
-        if (id != null) {
-            IdResolver.registerElementById(element, id);
+        Attr attr = element.getAttributeNodeNS(null, "Id");
+        if (attr != null) {
+            element.setIdAttributeNode(attr, true);
         }
         
         int length = getLength();
         for (int i = 0; i < length; i++) {
             Element propertyElem =
                 XMLUtils.selectDsNode(this.constructionElement, Constants._TAG_SIGNATUREPROPERTY, i);
-            String propertyId = XMLUtils.getAttributeValue(propertyElem, "Id");
-            if (propertyId != null) {
-                IdResolver.registerElementById(propertyElem, propertyId);
+            Attr propertyAttr = propertyElem.getAttributeNodeNS(null, "Id");
+            if (propertyAttr != null) {
+                propertyElem.setIdAttributeNode(propertyAttr, true);
             }
         }
     }
@@ -114,7 +114,7 @@ public class SignatureProperties extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
diff --git a/src/main/java/org/apache/xml/security/signature/SignatureProperty.java b/src/main/java/org/apache/xml/security/signature/SignatureProperty.java
index 1a55241..c67325f 100644
--- a/src/main/java/org/apache/xml/security/signature/SignatureProperty.java
+++ b/src/main/java/org/apache/xml/security/signature/SignatureProperty.java
@@ -20,7 +20,6 @@ package org.apache.xml.security.signature;
 
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.utils.Constants;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -80,7 +79,7 @@ public class SignatureProperty extends SignatureElementProxy {
     public void setId(String Id) {
         if (Id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
-            IdResolver.registerElementById(this.constructionElement, Id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
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 2b430ec..47c9938 100644
--- a/src/main/java/org/apache/xml/security/signature/XMLSignature.java
+++ b/src/main/java/org/apache/xml/security/signature/XMLSignature.java
@@ -38,13 +38,13 @@ import org.apache.xml.security.transforms.Transforms;
 import org.apache.xml.security.utils.Base64;
 import org.apache.xml.security.utils.Constants;
 import org.apache.xml.security.utils.I18n;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.SignatureElementProxy;
 import org.apache.xml.security.utils.SignerOutputStream;
 import org.apache.xml.security.utils.UnsyncBufferedOutputStream;
 import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.ResourceResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -363,9 +363,9 @@ public final class XMLSignature extends SignatureElementProxy {
             Object exArgs[] = { Constants._TAG_SIGNATUREVALUE, Constants._TAG_SIGNATURE };
             throw new XMLSignatureException("xml.WrongContent", exArgs);
         }
-        String signatureValueId = XMLUtils.getAttributeValue(signatureValueElement, "Id");
-        if (signatureValueId != null) {
-            IdResolver.registerElementById(signatureValueElement, signatureValueId);
+        Attr signatureValueAttr = signatureValueElement.getAttributeNodeNS(null, "Id");
+        if (signatureValueAttr != null) {
+            signatureValueElement.setIdAttributeNode(signatureValueAttr, true);
         }
 
         // <element ref="ds:KeyInfo" minOccurs="0"/>
@@ -384,9 +384,9 @@ public final class XMLSignature extends SignatureElementProxy {
         Element objectElem =
             XMLUtils.getNextElement(signatureValueElement.getNextSibling());
         while (objectElem != null) {
-            String objectId = XMLUtils.getAttributeValue(objectElem, "Id");
-            if (objectId != null) {
-                IdResolver.registerElementById(objectElem, objectId);
+            Attr objectAttr = objectElem.getAttributeNodeNS(null, "Id");
+            if (objectAttr != null) {
+                objectElem.setIdAttributeNode(objectAttr, true);
             }
 
             NodeList nodes = objectElem.getChildNodes();
@@ -419,7 +419,7 @@ public final class XMLSignature extends SignatureElementProxy {
     public void setId(String id) {
         if (id != null) {
             this.constructionElement.setAttributeNS(null, Constants._ATT_ID, id);
-            IdResolver.registerElementById(this.constructionElement, id);
+            this.constructionElement.setIdAttributeNS(null, Constants._ATT_ID, true);
         }
     }
 
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 3e75dd5..400a6ec 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
@@ -19,7 +19,6 @@
 package org.apache.xml.security.utils.resolver.implementations;
 
 import org.apache.xml.security.signature.XMLSignatureInput;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolverException;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 import org.w3c.dom.Attr;
@@ -79,7 +78,7 @@ public class ResolverFragment extends ResourceResolverSpi {
              */
             String id = uriNodeValue.substring(1);
 
-            selectedElem = IdResolver.getElementById(doc, id);
+            selectedElem = doc.getElementById(id);
             if (selectedElem == null) {
                 Object exArgs[] = { id };
                 throw new ResourceResolverException(
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 d8513d3..86f33eb 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
@@ -19,7 +19,6 @@
 package org.apache.xml.security.utils.resolver.implementations;
 
 import org.apache.xml.security.signature.XMLSignatureInput;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.utils.resolver.ResourceResolverException;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 import org.w3c.dom.Attr;
@@ -69,7 +68,7 @@ public class ResolverXPointer extends ResourceResolverSpi {
             resultNode = doc;
         } else if (isXPointerId(uriStr)) {
             String id = getXPointerId(uriStr);
-            resultNode = IdResolver.getElementById(doc, id);
+            resultNode = doc.getElementById(id);
 
             if (resultNode == null) {
                 Object exArgs[] = { id };
diff --git a/src/test/java/org/apache/xml/security/test/c14n/implementations/Bug45961Test.java b/src/test/java/org/apache/xml/security/test/c14n/implementations/Bug45961Test.java
index b0fc51b..0185989 100644
--- a/src/test/java/org/apache/xml/security/test/c14n/implementations/Bug45961Test.java
+++ b/src/test/java/org/apache/xml/security/test/c14n/implementations/Bug45961Test.java
@@ -104,6 +104,7 @@ public class Bug45961Test extends org.junit.Assert {
         object = new ObjectContainer(document);
         object.appendChild(root2);
         object.setId(OBJECT_ID);
+        root.appendChild(object.getElement());
 
         signature.addDocument("#" + OBJECT_ID);
         signature.addDocument("", getTransforms(document));
diff --git a/src/test/java/org/apache/xml/security/test/encryption/XMLCipherTest.java b/src/test/java/org/apache/xml/security/test/encryption/XMLCipherTest.java
index 21be5fb..cde29da 100644
--- a/src/test/java/org/apache/xml/security/test/encryption/XMLCipherTest.java
+++ b/src/test/java/org/apache/xml/security/test/encryption/XMLCipherTest.java
@@ -47,7 +47,6 @@ import org.apache.xml.security.encryption.EncryptionMethod;
 import org.apache.xml.security.encryption.CipherData;
 import org.apache.xml.security.transforms.params.XPathContainer;
 import org.apache.xml.security.utils.EncryptionConstants;
-import org.apache.xml.security.utils.IdResolver;
 import org.apache.xml.security.keys.KeyInfo;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -614,7 +613,7 @@ public class XMLCipherTest extends org.junit.Assert {
             // Add the cipher text
             Element encryptedElement = d.createElement("CipherText");
             encryptedElement.setAttributeNS(null, "Id", "CipherTextId");
-            IdResolver.registerElementById(encryptedElement, "CipherTextId");
+            encryptedElement.setIdAttributeNS(null, "Id", true);
             encryptedElement.appendChild(d.createTextNode(tstBase64EncodedString));
             docElement.appendChild(encryptedElement);
             // dump(d);
diff --git a/src/test/java/org/apache/xml/security/test/signature/CreateSignatureTest.java b/src/test/java/org/apache/xml/security/test/signature/CreateSignatureTest.java
index 3b928ed..6310ef8 100644
--- a/src/test/java/org/apache/xml/security/test/signature/CreateSignatureTest.java
+++ b/src/test/java/org/apache/xml/security/test/signature/CreateSignatureTest.java
@@ -85,6 +85,7 @@ public class CreateSignatureTest extends org.junit.Assert {
 
         XMLSignature sig = 
             new XMLSignature(doc, null, XMLSignature.ALGO_ID_SIGNATURE_DSA);
+        envelope.appendChild(sig.getElement());
 
         ObjectContainer object1 = new ObjectContainer(doc);
         object1.setId("object-1");
diff --git a/src/test/java/org/apache/xml/security/test/signature/InvalidKeyTest.java b/src/test/java/org/apache/xml/security/test/signature/InvalidKeyTest.java
index a99627b..d4be238 100755
--- a/src/test/java/org/apache/xml/security/test/signature/InvalidKeyTest.java
+++ b/src/test/java/org/apache/xml/security/test/signature/InvalidKeyTest.java
@@ -26,7 +26,6 @@ import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.apache.xml.security.Init;
 import org.apache.xml.security.signature.XMLSignature;
-import org.apache.xml.security.utils.IdResolver;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -77,9 +76,8 @@ public class InvalidKeyTest extends org.junit.Assert {
             assertion = assertion.getNextSibling();
         }
         Attr attr = ((Element)assertion).getAttributeNodeNS(null, "AssertionID");
-        String id = (attr == null) ? null : attr.getValue();
-        if (id != null) {
-            IdResolver.registerElementById((Element)assertion, id);
+        if (attr != null) {
+            ((Element)assertion).setIdAttributeNode(attr, true);
         }
         
         NodeList nl = assertion.getChildNodes();
diff --git a/src/test/java/org/apache/xml/security/test/signature/ProcessingInstructionTest.java b/src/test/java/org/apache/xml/security/test/signature/ProcessingInstructionTest.java
index 8e240a3..7549fd8 100644
--- a/src/test/java/org/apache/xml/security/test/signature/ProcessingInstructionTest.java
+++ b/src/test/java/org/apache/xml/security/test/signature/ProcessingInstructionTest.java
@@ -37,8 +37,6 @@ import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
-import org.apache.xml.security.utils.IdResolver;
-import org.apache.xml.security.utils.XMLUtils;
 import org.apache.xml.security.utils.resolver.ResourceResolverException;
 import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
 
@@ -75,9 +73,9 @@ public class ProcessingInstructionTest extends org.junit.Assert {
             doc.getElementsByTagNameNS("http://uri.etsi.org/01903/v1.3.2#", "QualifyingProperties").item(0);
         while (obj != null) {
             if (obj instanceof Element) {
-                String id = XMLUtils.getAttributeValue((Element)obj, "Id");
-                if (id != null) {
-                    IdResolver.registerElementById((Element)obj, id);
+                Attr attr = ((Element)obj).getAttributeNode("Id");
+                if (attr != null) {
+                    ((Element)obj).setIdAttributeNode(attr, true);
                 }
             }
             obj = obj.getFirstChild();
