diff --git a/src/xercesc/parsers/DOMBuilderImpl.cpp b/src/xercesc/parsers/DOMBuilderImpl.cpp
index f6d3354fb8a6d5e9a8982d32fe969f10e92f08dd..0ed2db6219ecf7a8a0696d15fed5e8f4b6c6471c 100644
--- a/src/xercesc/parsers/DOMBuilderImpl.cpp
+++ b/src/xercesc/parsers/DOMBuilderImpl.cpp
@@ -91,6 +91,8 @@ AbstractDOMParser(valToAdopt)
 , fErrorHandler(0)
 , fEntityResolver(0)
 , fFilter(0)
+, fReuseGrammar(false)
+, fCharsetOverridesXMLEncoding(true)
 {
 }
 
@@ -136,19 +138,22 @@ void DOMBuilderImpl::setFilter(DOMBuilderFilter* const filter)
 // ---------------------------------------------------------------------------
 void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state)
 {
-	if (getParseInProgress())
-		throw SAXNotSupportedException("Feature modification is not supported during parse.");
-
-    if (XMLString::compareString(name, XMLUni::fgDOMEntities) == 0) {
+    if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {
         setCreateEntityReferenceNodes(state);
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMNamespaces) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {
+        setCreateCommentNodes(state);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {
+        getScanner()->setNormalizeData(state);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {
         setDoNamespaces(state);
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
         setIncludeIgnorableWhitespace(state);
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMValidation) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {
 
         fValidation = state;
 
@@ -160,7 +165,7 @@ void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state)
             setValidationScheme(AbstractDOMParser::Val_Never);
         }
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
 
         fAutoValidation = state;
 
@@ -171,28 +176,115 @@ void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state)
             setValidationScheme(AbstractDOMParser::Val_Never);
         }
     }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {
+        // in fact, setting this has no effect to the parser
+        fCharsetOverridesXMLEncoding = state;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
+        if (state)
+            throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
+        if (!state)
+            throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesReuseGrammar) == 0)
+    {
+        fReuseGrammar = state;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
+    {
+    	  setDoSchema(state);
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)
+    {
+    	  setValidationSchemaFullChecking(state);
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)
+    {
+    	  setLoadExternalDTD(state);
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
+    {
+         setExitOnFirstFatalError(!state);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)
+    {
+         setValidationConstraintFatal(state);
+    }
     else {
-        throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
+        throw DOMException(DOMException::NOT_FOUND_ERR, 0);
     }
 }
 
 bool DOMBuilderImpl::getFeature(const XMLCh* const name)
 {
-    if (XMLString::compareString(name, XMLUni::fgDOMEntities) == 0) {
+    if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {
         return getCreateEntityReferenceNodes();
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMNamespaces) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {
+        return getCreateCommentNodes();
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {
+        return getScanner()->getNormalizeData();
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {
         return getDoNamespaces();
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {
         return getIncludeIgnorableWhitespace();
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMValidation) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {
         return fValidation;
     }
-    else if (XMLString::compareString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
+    else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {
         return fAutoValidation;
     }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {
+        return fCharsetOverridesXMLEncoding;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
+        return false;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
+        return true;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesReuseGrammar) == 0)
+    {
+        return fReuseGrammar;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
+    {
+    	  return getDoSchema();
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)
+    {
+    	  return getValidationSchemaFullChecking();
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)
+    {
+    	  return getLoadExternalDTD();
+    }
+
+    else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)
+    {
+         return !getExitOnFirstFatalError();
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)
+    {
+         return getValidationConstraintFatal();
+    }
     else {
         throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
     }
@@ -202,41 +294,89 @@ bool DOMBuilderImpl::getFeature(const XMLCh* const name)
 
 bool DOMBuilderImpl::canSetFeature(const XMLCh* const name, const bool state)
 {
-    if ((XMLString::compareString(name, XMLUni::fgDOMEntities) == 0) ||
-        (XMLString::compareString(name, XMLUni::fgDOMNamespaces) == 0) ||
-        (XMLString::compareString(name, XMLUni::fgDOMValidation) == 0) ||
-        (XMLString::compareString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||
-        (XMLString::compareString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0)) {
+    if ((XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0)) {
         return true;
     }
 
+    else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {
+        if (!state)
+            return true;
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||
+             XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {
+        if (state)
+            return true;
+    }
+    else if ((XMLString::compareIString(name, XMLUni::fgXercesReuseGrammar) == 0) ||
+             (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0) ||
+             (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0) ||
+             (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0) ||
+             (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0) ||
+             (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)) {
+        return true;
+    }
     return false;
 }
 
+void DOMBuilderImpl::setProperty(const XMLCh* const name, void* value)
+{
+	if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0)
+	{
+		setExternalSchemaLocation((XMLCh*)value);
+	}
+
+	else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
+	{
+		setExternalNoNamespaceSchemaLocation((XMLCh*)value);
+	}
+
+   else
+      throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
+}
+
+
+void* DOMBuilderImpl::getProperty(const XMLCh* const name) const
+{
+    if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalSchemaLocation) == 0)
+        return (void*)getExternalSchemaLocation();
+    else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
+        return (void*)getExternalNoNamespaceSchemaLocation();
+    else
+        throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0);
+    return 0;
+}
+
+
 // ---------------------------------------------------------------------------
 //  DOMBuilderImpl: Parsing methods
 // ---------------------------------------------------------------------------
-DOMDocument* DOMBuilderImpl::parse(const DOMInputSource& source,
-                                   const bool reuseGrammar)
+DOMDocument* DOMBuilderImpl::parse(const DOMInputSource& source)
 {
     DOMInputSourceWrapper isWrapper((DOMInputSource*) &source);
 
     isWrapper.setAdoptInputSource(false);
-    AbstractDOMParser::parse(isWrapper, reuseGrammar);
+    AbstractDOMParser::parse(isWrapper, fReuseGrammar);
     return getDocument();
 }
 
-DOMDocument* DOMBuilderImpl::parseURI(const XMLCh* const systemId,
-                                      const bool reuseGrammar)
+DOMDocument* DOMBuilderImpl::parseURI(const XMLCh* const systemId)
 {
-    AbstractDOMParser::parse(systemId, reuseGrammar);
+    AbstractDOMParser::parse(systemId, fReuseGrammar);
     return getDocument();
 }
 
-DOMDocument* DOMBuilderImpl::parseURI(const char* const systemId,
-                                      const bool reuseGrammar)
+DOMDocument* DOMBuilderImpl::parseURI(const char* const systemId)
 {
-    AbstractDOMParser::parse(systemId, reuseGrammar);
+    AbstractDOMParser::parse(systemId, fReuseGrammar);
     return getDocument();
 }