diff --git a/Projects/Win32/BCB6/Xerces-all/SAX2Print/SAX2Print.bpr b/Projects/Win32/BCB6/Xerces-all/SAX2Print/SAX2Print.bpr
index 2d3ea6cca271b5f5681111c29c5631e7208fc926..25bb16579d1cb1173669478a0fccef65016d7aa7 100644
--- a/Projects/Win32/BCB6/Xerces-all/SAX2Print/SAX2Print.bpr
+++ b/Projects/Win32/BCB6/Xerces-all/SAX2Print/SAX2Print.bpr
@@ -5,7 +5,8 @@
     <VERSION value="BCB.06.00"/>
     <PROJECT value="..\..\..\..\..\Build\Win32\BCB6\SAX2Print.exe"/>
     <OBJFILES value="..\..\..\..\..\Build\Win32\BCB6\obj\SAX2Print.obj 
-      ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2PrintHandlers.obj"/>
+      ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2PrintHandlers.obj
+	  ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2FilterHandlers.obj"/>
     <RESFILES value=""/>
     <IDLFILES value=""/>
     <DEFFILE value=""/>
diff --git a/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.bpr b/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.bpr
index 016bdd9dbf24c51bc1bbb18be6c1aa366efc3910..18cd8a6f6a8aedcd172af39738e4c8d3ae0e9289 100644
--- a/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.bpr
+++ b/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.bpr
@@ -133,6 +133,7 @@
       ..\..\..\..\..\Build\Win32\BCB6\obj\AbstractDOMParser.obj 
       ..\..\..\..\..\Build\Win32\BCB6\obj\DOMBuilderImpl.obj 
       ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2XMLReaderImpl.obj 
+      ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2XMLFilterImpl.obj 
       ..\..\..\..\..\Build\Win32\BCB6\obj\SAXParser.obj 
       ..\..\..\..\..\Build\Win32\BCB6\obj\XercesDOMParser.obj 
       ..\..\..\..\..\Build\Win32\BCB6\obj\AllContentModel.obj 
@@ -530,6 +531,7 @@
       <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\AbstractDOMParser.cpp" FORMNAME="" UNITNAME="AbstractDOMParser" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
       <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\DOMBuilderImpl.cpp" FORMNAME="" UNITNAME="DOMBuilderImpl" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
       <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\SAX2XMLReaderImpl.cpp" FORMNAME="" UNITNAME="SAX2XMLReaderImpl" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
+      <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.cpp" FORMNAME="" UNITNAME="SAX2XMLFilterImpl" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
       <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\SAXParser.cpp" FORMNAME="" UNITNAME="SAXParser" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
       <FILE FILENAME="..\..\..\..\..\src\xercesc\parsers\XercesDOMParser.cpp" FORMNAME="" UNITNAME="XercesDOMParser" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
       <FILE FILENAME="..\..\..\..\..\src\xercesc\validators\common\AllContentModel.cpp" FORMNAME="" UNITNAME="AllContentModel" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
diff --git a/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.mak b/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.mak
index a2ebe9f7e9297dc25b4bbb9af202faddf062d50e..c48a1e5aed6d9281ab97799fe65af7bfdcfa46ca 100644
--- a/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.mak
+++ b/Projects/Win32/BCB6/Xerces-all/XercesLib/XercesLib.mak
@@ -131,6 +131,7 @@ OBJFILES = ..\..\..\..\..\Build\Win32\BCB6\obj\Xerceslib.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\AbstractDOMParser.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\DOMBuilderImpl.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2XMLReaderImpl.obj \
+    ..\..\..\..\..\Build\Win32\BCB6\obj\SAX2XMLFilterImpl.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\SAXParser.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\XercesDOMParser.obj \
     ..\..\..\..\..\Build\Win32\BCB6\obj\AllContentModel.obj \
diff --git a/Projects/Win32/BCC.551/Xerces-all/SAX2Print/SAX2Print.mak b/Projects/Win32/BCC.551/Xerces-all/SAX2Print/SAX2Print.mak
index a5fafc122c7c21fac2f81a049c1c660c478a39f0..078b8b9c3ff24163d6fa1c0295fc3bb1a5928b2d 100644
--- a/Projects/Win32/BCC.551/Xerces-all/SAX2Print/SAX2Print.mak
+++ b/Projects/Win32/BCC.551/Xerces-all/SAX2Print/SAX2Print.mak
@@ -6,7 +6,8 @@ BCB = $(MAKEDIR)\..
 TARGETPATH=..\..\..\..\..\Build\Win32\BCC.551
 PROJECT = $(TARGETPATH)\SAX2Print.exe
 OBJFILES = $(TARGETPATH)\obj\SAX2Print.obj \
-    $(TARGETPATH)\obj\SAX2PrintHandlers.obj
+    $(TARGETPATH)\obj\SAX2PrintHandlers.obj \
+	$(TARGETPATH)\obj\SAX2FilterHandlers.obj
 RESFILES = 
 MAINSOURCE = SAX2Print.cpp
 RESDEPEN = $(RESFILES)
diff --git a/Projects/Win32/BCC.551/Xerces-all/XercesLib/XercesLib.mak b/Projects/Win32/BCC.551/Xerces-all/XercesLib/XercesLib.mak
index e52c773b2f36ca84f1c65d2c5da28c8e53ceb051..c982eab139fc2b6ae85e1b512016cd8267856844 100644
--- a/Projects/Win32/BCC.551/Xerces-all/XercesLib/XercesLib.mak
+++ b/Projects/Win32/BCC.551/Xerces-all/XercesLib/XercesLib.mak
@@ -161,6 +161,7 @@ OBJFILES = $(TARGETPATH)\obj\XercesLib.obj \
     $(TARGETPATH)\obj\XMLReader.obj \
     $(TARGETPATH)\obj\XMLScanner.obj \
     $(TARGETPATH)\obj\SAX2XMLReaderImpl.obj \
+    $(TARGETPATH)\obj\SAX2XMLFilterImpl.obj \
     $(TARGETPATH)\obj\SAXParser.obj \
     $(TARGETPATH)\obj\DOMAttrImpl.obj \
     $(TARGETPATH)\obj\DOMAttrMapImpl.obj \
diff --git a/Projects/Win32/VC6/xerces-all/SAX2Print/SAX2Print.dsp b/Projects/Win32/VC6/xerces-all/SAX2Print/SAX2Print.dsp
index 7c61cec2a6f6bb4162e71f041332455662c8c8fb..75cc2b0cc37657c53921d88ec2da5e319d02b8fc 100644
--- a/Projects/Win32/VC6/xerces-all/SAX2Print/SAX2Print.dsp
+++ b/Projects/Win32/VC6/xerces-all/SAX2Print/SAX2Print.dsp
@@ -43,17 +43,15 @@ RSC=rc.exe
 # PROP Intermediate_Dir "..\..\..\..\..\Build\Win32\VC6\Release\obj"
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
-# ADD BASE CPP  /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP  /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
+# ADD BASE CPP /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # SUBTRACT CPP /YX
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
 # ADD RSC /l 0x409 /d "NDEBUG"
 BSC32=bscmake.exe
-# ADD BASE BSC32 
-# ADD BSC32 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib xerces-c_2.lib  /version:1.0 /subsystem:console /incremental:yes /machine:I386 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib xerces-c_2.lib /version:1.0 /subsystem:console /incremental:yes /machine:I386 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
 
 !ELSEIF  "$(CFG)" == "SAX2Print - Win32 Debug"
 
@@ -68,17 +66,15 @@ LINK32=link.exe
 # PROP Intermediate_Dir "..\..\..\..\..\Build\Win32\VC6\Debug\obj"
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
-# ADD BASE CPP  /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP  /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
+# ADD BASE CPP /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # SUBTRACT CPP /YX
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
 # ADD RSC /l 0x409 /d "_DEBUG"
 BSC32=bscmake.exe
-# ADD BASE BSC32 
-# ADD BSC32 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib xerces-c_2D.lib  /version:1.0 /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib xerces-c_2D.lib /version:1.0 /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
 
 !ELSEIF  "$(CFG)" == "SAX2Print - Win64 Debug"
 
@@ -94,18 +90,16 @@ LINK32=link.exe
 # PROP Intermediate_Dir "..\..\..\..\..\Build\Win64\VC6\Debug\obj"
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
-# ADD BASE CPP  /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
+# ADD BASE CPP /G6 /MDd /Za /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\src" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # SUBTRACT BASE CPP /YX
 # ADD CPP /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\..\..\src" /D "WIN64" /D "_DEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
 # ADD RSC /l 0x409 /d "_DEBUG"
 BSC32=bscmake.exe
-# ADD BASE BSC32 
-# ADD BSC32 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib xerces-c_2D.lib  /version:1.0 /subsystem:console /debug  /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
-# ADD LINK32 kernel32.lib user32.lib xerces-c_2D.lib /version:1.0 /subsystem:console /debug  /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win64\VC6\Debug" /machine:IA64
-# SUBTRACT LINK32  /pdb:none
+# ADD BASE LINK32 kernel32.lib user32.lib xerces-c_2D.lib /version:1.0 /subsystem:console /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win32\VC6\Debug"
+# ADD LINK32 kernel32.lib user32.lib xerces-c_2D.lib /version:1.0 /subsystem:console /debug /machine:IX86 /pdbtype:sept /libpath:"..\..\..\..\..\Build\Win64\VC6\Debug" /machine:IA64
+# SUBTRACT LINK32 /pdb:none
 
 !ELSEIF  "$(CFG)" == "SAX2Print - Win64 Release"
 
@@ -121,18 +115,16 @@ LINK32=link.exe
 # PROP Intermediate_Dir "..\..\..\..\..\Build\Win64\VC6\Release\obj"
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
-# ADD BASE CPP  /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
+# ADD BASE CPP /G6 /MD /Za /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # SUBTRACT BASE CPP /YX
-# ADD CPP /MD /Ze /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
+# ADD CPP /MD /W3 /GX /O2 /Ob2 /I "..\..\..\..\..\src" /D "WIN64" /D "NDEBUG" /D "_CONSOLE" /D "WIN32" /D "_WINDOWS" /D "PLATFORM_WIN32" /FD /c
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
 # ADD RSC /l 0x409 /d "NDEBUG"
 BSC32=bscmake.exe
-# ADD BASE BSC32 
-# ADD BSC32 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib xerces-c_2.lib  /version:1.0 /subsystem:console /incremental:yes  /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
-# ADD LINK32 kernel32.lib user32.lib xerces-c_2.lib /version:1.0 /subsystem:console /incremental:yes  /libpath:"..\..\..\..\..\Build\Win64\VC6\Release" /machine:IA64
-# SUBTRACT LINK32  /pdb:none
+# ADD BASE LINK32 kernel32.lib user32.lib xerces-c_2.lib /version:1.0 /subsystem:console /incremental:yes /machine:IX86 /libpath:"..\..\..\..\..\Build\Win32\VC6\Release"
+# ADD LINK32 kernel32.lib user32.lib xerces-c_2.lib /version:1.0 /subsystem:console /incremental:yes /machine:IX86 /libpath:"..\..\..\..\..\Build\Win64\VC6\Release" /machine:IA64
+# SUBTRACT LINK32 /pdb:none
 
 !ENDIF 
 
@@ -144,6 +136,14 @@ LINK32=link.exe
 # Name "SAX2Print - Win64 Release"
 # Begin Source File
 
+SOURCE=..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.hpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\samples\SAX2Print\SAX2Print.cpp
 # End Source File
 # Begin Source File
diff --git a/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp b/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp
index b6cfabe138bf78a2543363a907495fe69a9874ce..5c5630e61d7e1d4cb905c32726989b728bdc9fe9 100644
--- a/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp
+++ b/Projects/Win32/VC6/xerces-all/XercesLib/XercesLib.dsp
@@ -72,7 +72,6 @@ LINK32=link.exe
 # PROP Target_Dir ""
 # ADD BASE CPP /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
 # ADD CPP /G6 /MDd /Za /W3 /Gm /GX /Zi /Od /I "..\..\..\..\..\src" /D "_CRTDBG_MAP_ALLOC" /D "PROJ_SAX2" /D "_DEBUG" /D "PROJ_XMLPARSER" /D "PROJ_XMLUTIL" /D "PROJ_PARSERS" /D "PROJ_SAX4C" /D "PROJ_DOM" /D "PROJ_VALIDATORS" /D "XML_SINGLEDLL" /D "WIN32" /D "_WINDOWS" /D "XML_USE_WIN32_TRANSCODER" /D "XML_USE_WIN32_MSGLOADER" /D "XML_USE_NETACCESSOR_WINSOCK" /FR /FD /c
-# SUBTRACT CPP /YX
 # ADD BASE MTL /D "_DEBUG" /mktyplib203 /o "NUL" /win32
 # ADD MTL /D "_DEBUG" /mktyplib203 /o "NUL" /win32
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
@@ -1752,6 +1751,14 @@ SOURCE=..\..\..\..\..\src\xercesc\parsers\DOMBuilderImpl.hpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.hpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\src\xercesc\parsers\SAX2XMLReaderImpl.cpp
 # End Source File
 # Begin Source File
@@ -2556,6 +2563,10 @@ SOURCE=..\..\..\..\..\src\xercesc\sax2\sax2Dummy.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\..\..\..\src\xercesc\sax2\SAX2XMLFilter.hpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\..\..\..\src\xercesc\sax2\SAX2XMLReader.hpp
 # End Source File
 # Begin Source File
diff --git a/Projects/Win32/VC7.1/xerces-all/SAX2Print/SAX2Print.vcproj b/Projects/Win32/VC7.1/xerces-all/SAX2Print/SAX2Print.vcproj
index af0cb3cbddfbf35ce77b4e106d57865278aaeaba..821d96499f40b5ff32620ec1d67271eb928550f5 100644
--- a/Projects/Win32/VC7.1/xerces-all/SAX2Print/SAX2Print.vcproj
+++ b/Projects/Win32/VC7.1/xerces-all/SAX2Print/SAX2Print.vcproj
@@ -251,6 +251,12 @@
 	<References>
 	</References>
 	<Files>
+		<File
+			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.cpp">
+		</File>
+		<File
+			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.hpp">
+		</File>
 		<File
 			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2Print.cpp">
 		</File>
diff --git a/Projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj b/Projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj
index fbc8b09f87793b1905e8a49654bebc0800c695b4..1680203f4de14b32174637b6d020f866a491d85d 100644
--- a/Projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj
+++ b/Projects/Win32/VC7.1/xerces-all/XercesLib/XercesLib.vcproj
@@ -1604,6 +1604,12 @@
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\parsers\DOMBuilderImpl.hpp">
 			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.cpp">
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.hpp">
+			</File>
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLReaderImpl.cpp">
 			</File>
@@ -2214,6 +2220,9 @@
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\sax2\sax2Dummy.cpp">
 			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\sax2\SAX2XMLFilter.hpp">
+			</File>
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\sax2\SAX2XMLReader.hpp">
 			</File>
diff --git a/Projects/Win32/VC7/xerces-all/SAX2Print/SAX2Print.vcproj b/Projects/Win32/VC7/xerces-all/SAX2Print/SAX2Print.vcproj
index b0090b5b178abb49f5030193527f3063b34266d0..dbd8ce27d5c76128a3c2faa6917bf271c39805d8 100644
--- a/Projects/Win32/VC7/xerces-all/SAX2Print/SAX2Print.vcproj
+++ b/Projects/Win32/VC7/xerces-all/SAX2Print/SAX2Print.vcproj
@@ -131,6 +131,12 @@
 		<File
 			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2PrintHandlers.hpp">
 		</File>
+		<File
+			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.cpp">
+		</File>
+		<File
+			RelativePath="..\..\..\..\..\samples\SAX2Print\SAX2FilterHandlers.hpp">
+		</File>
 	</Files>
 	<Globals>
 	</Globals>
diff --git a/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj b/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj
index ba63d3d29382b5e2151f05c23d6cb6f26a849dda..994ca56324bd07ddf498eb0ffedd3b5e5f89a65e 100644
--- a/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj
+++ b/Projects/Win32/VC7/xerces-all/XercesLib/XercesLib.vcproj
@@ -1374,6 +1374,12 @@
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLReaderImpl.hpp">
 			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.cpp">
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAX2XMLFilterImpl.hpp">
+			</File>
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\parsers\SAXParser.cpp">
 			</File>
@@ -1972,6 +1978,9 @@
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\sax2\SAX2XMLReader.hpp">
 			</File>
+			<File
+				RelativePath="..\..\..\..\..\src\xercesc\sax2\SAX2XMLFilter.hpp">
+			</File>
 			<File
 				RelativePath="..\..\..\..\..\src\xercesc\sax2\XMLReaderFactory.hpp">
 			</File>
diff --git a/samples/SAX2Print/Makefile.in b/samples/SAX2Print/Makefile.in
index 5e233a2432090a0779deb22b9a334863cdd2e806..e5b0c3ecc171245cb75b0ae23b3024001cacaa66 100644
--- a/samples/SAX2Print/Makefile.in
+++ b/samples/SAX2Print/Makefile.in
@@ -47,9 +47,9 @@ APP_NAME=SAX2Print
 
 OUTDIR= ${XERCESCOUT}/bin/obj/${APP_NAME}
 EXEC=	${XERCESCOUT}/bin
-OBJS=	${OUTDIR}/SAX2Print.o ${OUTDIR}/SAX2PrintHandlers.o
+OBJS=	${OUTDIR}/SAX2Print.o ${OUTDIR}/SAX2PrintHandlers.o ${OUTDIR}/SAX2FilterHandlers.o
 SRC=	${XERCESCOUT}/samples/${APP_NAME}
-HEADER_FILES=${SRC}/SAX2Print.hpp ${SRC}/SAX2PrintHandlers.hpp
+HEADER_FILES=${SRC}/SAX2Print.hpp ${SRC}/SAX2PrintHandlers.hpp ${SRC}/SAX2FilterHandlers.hpp
 
 ## OS390BATCH
 ifeq (${OS390BATCH},1)
@@ -73,6 +73,9 @@ $(OUTDIR)/SAX2Print.o:: ${SRC}/SAX2Print.cpp ${HEADER_FILES}
 $(OUTDIR)/SAX2PrintHandlers.o:: ${SRC}/SAX2PrintHandlers.cpp ${HEADER_FILES}
 	${CC} ${INCLUDES} ${CMP} -o $(OUTDIR)/SAX2PrintHandlers.o ${SRC}/SAX2PrintHandlers.cpp
 
+$(OUTDIR)/SAX2FilterHandlers.o:: ${SRC}/SAX2FilterHandlers.cpp ${HEADER_FILES}
+	${CC} ${INCLUDES} ${CMP} -o $(OUTDIR)/SAX2FilterHandlers.o ${SRC}/SAX2FilterHandlers.cpp
+
 clean::
 	rm -f ${OBJS} ${EXEC}/${APP_NAME}
 
diff --git a/samples/SAX2Print/SAX2Print.cpp b/samples/SAX2Print/SAX2Print.cpp
index b5bd746abe8d1384dfd9d173d79703319fd322b6..d1346018a3948d62d3db0f0651e243caf4fd481f 100644
--- a/samples/SAX2Print/SAX2Print.cpp
+++ b/samples/SAX2Print/SAX2Print.cpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.18  2004/12/24 19:21:46  amassari
+ * Add support for SAX2 filters (jira# 1133)
+ *
  * Revision 1.17  2004/09/08 13:55:33  peiyongz
  * Apache License Version 2.0
  *
@@ -81,6 +84,7 @@
 #include <xercesc/sax2/XMLReaderFactory.hpp>
 #include "SAX2Print.hpp"
 #include <xercesc/util/OutOfMemoryException.hpp>
+#include "SAX2FilterHandlers.hpp"
 
 // ---------------------------------------------------------------------------
 //  Local data
@@ -109,6 +113,7 @@ static bool                     doNamespaces    = true;
 static bool                     doSchema        = true;
 static bool                     schemaFullChecking = false;
 static bool                     namespacePrefixes = false;
+static bool                     sortAttributes  = false;
 
 
 // ---------------------------------------------------------------------------
@@ -132,6 +137,7 @@ static void usage()
              "                NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.\n"
              "    -s          Disable schema processing. Defaults to on.\n"
              "                NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.\n"
+             "    -sa         Print the attributes in alfabetic order. Defaults to off.\n"
              "    -?          Show this help.\n\n"
              "  * = Default if not provided explicitly.\n\n"
              "The parser has intrinsic support for the following encodings:\n"
@@ -248,6 +254,10 @@ int main(int argC, char* argV[])
               ||  !strcmp(argV[parmInd], "-P"))
         {
             namespacePrefixes = true;
+        }
+         else if (!strcmp(argV[parmInd], "-sa"))
+        {
+            sortAttributes = true;
         }
          else
         {
@@ -272,7 +282,16 @@ int main(int argC, char* argV[])
     //  Create a SAX parser object. Then, according to what we were told on
     //  the command line, set it to validate or not.
     //
-    SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
+    SAX2XMLReader* parser;
+    SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
+    SAX2XMLReader* filter = NULL;
+    if(sortAttributes)
+    {
+        filter=new SAX2SortAttributesFilter(reader);
+        parser=filter;
+    }
+    else
+        parser=reader;
 
     //
     //  Then, according to what we were told on
@@ -337,7 +356,9 @@ int main(int argC, char* argV[])
     //
     //  Delete the parser itself.  Must be done prior to calling Terminate, below.
     //
-    delete parser;
+    delete reader;
+    if(filter)
+        delete filter;
 
     // And call the termination method
     XMLPlatformUtils::Terminate();
diff --git a/scripts/sanityTest.pl b/scripts/sanityTest.pl
index 96326f4263f66a4c999942a906b1903b5104ffdd..0c637cf003ffff066841a87f8352e743c19b90ca 100644
--- a/scripts/sanityTest.pl
+++ b/scripts/sanityTest.pl
@@ -71,6 +71,8 @@ system ("SAX2Print");
 system ("SAX2Print -v=never personal.xml");
 system ("SAX2Print personal.xml");
 system ("SAX2Print -p personal-schema.xml");
+system ("SAX2Print personal.xsd");
+system ("SAX2Print -sa personal.xsd");
 
 #  Run MemParse
 system ("MemParse");
diff --git a/scripts/sanityTest_ExpectedResult.log b/scripts/sanityTest_ExpectedResult.log
index d6f800e09ff38c132e244beb040de894cf732e68..1674302336b779d59fac60d18933903435265821 100644
--- a/scripts/sanityTest_ExpectedResult.log
+++ b/scripts/sanityTest_ExpectedResult.log
@@ -208,6 +208,7 @@ Options:
                 NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.
     -s          Disable schema processing. Defaults to on.
                 NOTE: THIS IS OPPOSITE FROM OTHER SAMPLES.
+    -sa         Print the attributes in alfabetic order. Defaults to off.
     -?          Show this help.
 
   * = Default if not provided explicitly.
@@ -333,7 +334,221 @@ The parser has intrinsic support for the following encodings:
     <link manager="Big.Boss"></link>
   </person>
 
-</personnel>
+</personnel><?xml version="1.0" encoding="LATIN1"?>
+<xs:schema>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace">
+   <xs:annotation>
+     <xs:documentation>
+        The schemaLocation of the relevant file is
+        "http://www.w3.org/2001/xml.xsd"; however,
+        we don't want to assume people are always
+        connected to the 'net when playing with this file.
+     </xs:documentation>
+   </xs:annotation>
+ </xs:import>
+
+ <xs:element name="personnel">
+  <xs:complexType>
+   <xs:sequence>
+     <xs:element ref="person" minOccurs="1" maxOccurs="unbounded"></xs:element>
+   </xs:sequence>
+  </xs:complexType>
+
+  <xs:unique name="unique1">
+   <xs:selector xpath="person"></xs:selector>
+   <xs:field xpath="name/given"></xs:field>
+   <xs:field xpath="name/family"></xs:field>
+  </xs:unique>
+  <xs:key name="empid">
+   <xs:selector xpath="person"></xs:selector>
+   <xs:field xpath="@id"></xs:field>
+  </xs:key>
+  <xs:keyref name="keyref1" refer="empid">
+   <xs:selector xpath="person"></xs:selector> 
+   <xs:field xpath="link/@manager"></xs:field>  
+  </xs:keyref>
+
+ </xs:element>
+
+ <xs:element name="person">
+  <xs:complexType>
+   <xs:sequence>
+     <xs:element ref="name"></xs:element>
+     <xs:element ref="email" minOccurs="0" maxOccurs="unbounded"></xs:element>
+     <xs:element ref="url" minOccurs="0" maxOccurs="unbounded"></xs:element>
+     <xs:element ref="link" minOccurs="0" maxOccurs="1"></xs:element>
+   </xs:sequence>
+   <xs:attribute name="id" type="xs:ID" use="required"></xs:attribute>
+   <xs:attribute name="note" type="xs:string"></xs:attribute>
+   <xs:attribute name="contr" default="false">
+    <xs:simpleType>
+     <xs:restriction base="xs:string">
+       <xs:enumeration value="true"></xs:enumeration>
+       <xs:enumeration value="false"></xs:enumeration>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:attribute>
+   <xs:attribute name="salary" type="xs:integer"></xs:attribute>
+   <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="name">
+  <xs:complexType>
+   <xs:all>
+    <xs:element ref="family"></xs:element>
+    <xs:element ref="given"></xs:element>
+   </xs:all>
+   <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="family">
+   <xs:complexType>
+     <xs:simpleContent>
+       <xs:extension base="xs:string">
+          <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+        </xs:extension>
+     </xs:simpleContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="given">
+   <xs:complexType>
+     <xs:simpleContent>
+       <xs:extension base="xs:string">
+          <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+        </xs:extension>
+     </xs:simpleContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="email" type="xs:string"></xs:element>
+
+ <xs:element name="url">
+  <xs:complexType>
+   <xs:attribute name="href" type="xs:string" default="http://"></xs:attribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="link">
+  <xs:complexType>
+   <xs:attribute name="manager" type="xs:IDREF"></xs:attribute>
+   <xs:attribute name="subordinates" type="xs:IDREFS"></xs:attribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:notation name="gif" public="-//APP/Photoshop/4.0" system="photoshop.exe"></xs:notation>
+
+</xs:schema><?xml version="1.0" encoding="LATIN1"?>
+<xs:schema>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace">
+   <xs:annotation>
+     <xs:documentation>
+        The schemaLocation of the relevant file is
+        "http://www.w3.org/2001/xml.xsd"; however,
+        we don't want to assume people are always
+        connected to the 'net when playing with this file.
+     </xs:documentation>
+   </xs:annotation>
+ </xs:import>
+
+ <xs:element name="personnel">
+  <xs:complexType>
+   <xs:sequence>
+     <xs:element maxOccurs="unbounded" minOccurs="1" ref="person"></xs:element>
+   </xs:sequence>
+  </xs:complexType>
+
+  <xs:unique name="unique1">
+   <xs:selector xpath="person"></xs:selector>
+   <xs:field xpath="name/given"></xs:field>
+   <xs:field xpath="name/family"></xs:field>
+  </xs:unique>
+  <xs:key name="empid">
+   <xs:selector xpath="person"></xs:selector>
+   <xs:field xpath="@id"></xs:field>
+  </xs:key>
+  <xs:keyref name="keyref1" refer="empid">
+   <xs:selector xpath="person"></xs:selector> 
+   <xs:field xpath="link/@manager"></xs:field>  
+  </xs:keyref>
+
+ </xs:element>
+
+ <xs:element name="person">
+  <xs:complexType>
+   <xs:sequence>
+     <xs:element ref="name"></xs:element>
+     <xs:element maxOccurs="unbounded" minOccurs="0" ref="email"></xs:element>
+     <xs:element maxOccurs="unbounded" minOccurs="0" ref="url"></xs:element>
+     <xs:element maxOccurs="1" minOccurs="0" ref="link"></xs:element>
+   </xs:sequence>
+   <xs:attribute name="id" type="xs:ID" use="required"></xs:attribute>
+   <xs:attribute name="note" type="xs:string"></xs:attribute>
+   <xs:attribute default="false" name="contr">
+    <xs:simpleType>
+     <xs:restriction base="xs:string">
+       <xs:enumeration value="true"></xs:enumeration>
+       <xs:enumeration value="false"></xs:enumeration>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:attribute>
+   <xs:attribute name="salary" type="xs:integer"></xs:attribute>
+   <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="name">
+  <xs:complexType>
+   <xs:all>
+    <xs:element ref="family"></xs:element>
+    <xs:element ref="given"></xs:element>
+   </xs:all>
+   <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="family">
+   <xs:complexType>
+     <xs:simpleContent>
+       <xs:extension base="xs:string">
+          <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+        </xs:extension>
+     </xs:simpleContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="given">
+   <xs:complexType>
+     <xs:simpleContent>
+       <xs:extension base="xs:string">
+          <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"></xs:anyAttribute>
+        </xs:extension>
+     </xs:simpleContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="email" type="xs:string"></xs:element>
+
+ <xs:element name="url">
+  <xs:complexType>
+   <xs:attribute default="http://" name="href" type="xs:string"></xs:attribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="link">
+  <xs:complexType>
+   <xs:attribute name="manager" type="xs:IDREF"></xs:attribute>
+   <xs:attribute name="subordinates" type="xs:IDREFS"></xs:attribute>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:notation name="gif" public="-//APP/Photoshop/4.0" system="photoshop.exe"></xs:notation>
+
+</xs:schema>
 Finished parsing the memory buffer containing the following XML statements:
 
 <?xml version='1.0' encoding='ascii'?>
diff --git a/src/xercesc/parsers/Makefile.in b/src/xercesc/parsers/Makefile.in
index 4feb74f3deee36281e046498223e4c309dfdde86..d49093aab4ef385576f07ecc3aa0829e0feb7d4a 100644
--- a/src/xercesc/parsers/Makefile.in
+++ b/src/xercesc/parsers/Makefile.in
@@ -45,7 +45,8 @@ PARSERS_CPP_PUBHEADERS = \
 	DOMBuilderImpl.hpp \
 	XercesDOMParser.hpp \
 	SAXParser.hpp \
-	SAX2XMLReaderImpl.hpp
+	SAX2XMLReaderImpl.hpp \
+	SAX2XMLFilterImpl.hpp
 
 PARSERS_CPP_PRIVHEADERS =
 
@@ -56,7 +57,8 @@ PARSERS_CPP_OBJECTS = \
 	DOMBuilderImpl.$(TO) \
 	XercesDOMParser.$(TO) \
 	SAXParser.$(TO) \
-	SAX2XMLReaderImpl.$(TO)
+	SAX2XMLReaderImpl.$(TO) \
+	SAX2XMLFilterImpl.$(TO)
 
 XML_INCL := $(XML_INCL) -I$(XERCESCROOT)/src
 
diff --git a/src/xercesc/parsers/SAX2XMLFilterImpl.cpp b/src/xercesc/parsers/SAX2XMLFilterImpl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7b2df228122308b6b35054a87fd58321e1a4c076
--- /dev/null
+++ b/src/xercesc/parsers/SAX2XMLFilterImpl.cpp
@@ -0,0 +1,419 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2004/12/24 19:21:46  amassari
+ * Add support for SAX2 filters (jira# 1133)
+ *
+ */
+
+#include <xercesc/parsers/SAX2XMLFilterImpl.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+SAX2XMLFilterImpl::SAX2XMLFilterImpl(SAX2XMLReader* parent) :
+    fParentReader(0)
+    , fDocHandler(0)
+    , fDTDHandler(0)
+    , fEntityResolver(0)
+    , fErrorHandler(0)
+{
+    setParent(parent);
+}
+
+SAX2XMLFilterImpl::~SAX2XMLFilterImpl()
+{
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLFilterImpl: XMLFilter impl
+// ---------------------------------------------------------------------------
+void SAX2XMLFilterImpl::setParent(SAX2XMLReader* parent)
+{
+    if(fParentReader)
+    {
+        fParentReader->setEntityResolver(0);
+        fParentReader->setDTDHandler(0);
+        fParentReader->setContentHandler(0);
+        fParentReader->setErrorHandler(0);
+    }
+    fParentReader=parent;
+    if(fParentReader)
+    {
+        fParentReader->setEntityResolver(this);
+        fParentReader->setDTDHandler(this);
+        fParentReader->setContentHandler(this);
+        fParentReader->setErrorHandler(this);
+    }
+}
+
+bool SAX2XMLFilterImpl::getExitOnFirstFatalError() const
+{
+    if(fParentReader)
+        fParentReader->getExitOnFirstFatalError();
+    return false;
+}
+
+bool SAX2XMLFilterImpl::getValidationConstraintFatal() const
+{
+    if(fParentReader)
+        fParentReader->getValidationConstraintFatal();
+    return false;
+}
+
+Grammar* SAX2XMLFilterImpl::getRootGrammar()
+{
+    if(fParentReader)
+        fParentReader->getRootGrammar();
+    return NULL;
+}
+
+const XMLCh* SAX2XMLFilterImpl::getURIText(unsigned int uriId) const
+{
+    if(fParentReader)
+        fParentReader->getURIText(uriId);
+    return NULL;
+}
+
+unsigned int SAX2XMLFilterImpl::getSrcOffset() const
+{
+    if(fParentReader)
+        fParentReader->getSrcOffset();
+    return 0;
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLFilterImpl Validator functions
+// ---------------------------------------------------------------------------
+void SAX2XMLFilterImpl::setValidator(XMLValidator* valueToAdopt)
+{
+    if(fParentReader)
+        fParentReader->setValidator(valueToAdopt);
+}
+
+XMLValidator* SAX2XMLFilterImpl::getValidator() const
+{
+    if(fParentReader)
+        return fParentReader->getValidator();
+	return 0;
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLReader Interface
+// ---------------------------------------------------------------------------
+int SAX2XMLFilterImpl::getErrorCount() const
+{
+    if(fParentReader)
+        return fParentReader->getErrorCount();
+    return 0;
+}
+
+void SAX2XMLFilterImpl::setExitOnFirstFatalError(const bool newState)
+{
+    if(fParentReader)
+        fParentReader->setExitOnFirstFatalError(newState);
+}
+
+void SAX2XMLFilterImpl::setValidationConstraintFatal(const bool newState)
+{
+    if(fParentReader)
+        fParentReader->setValidationConstraintFatal(newState);
+}
+
+void SAX2XMLFilterImpl::parse (const   InputSource&    source)
+{
+    if(fParentReader)
+        fParentReader->parse(source);
+}
+
+void SAX2XMLFilterImpl::parse (const   XMLCh* const    systemId)
+{
+    if(fParentReader)
+        fParentReader->parse(systemId);
+}
+
+void SAX2XMLFilterImpl::parse (const   char* const     systemId)
+{
+    if(fParentReader)
+        fParentReader->parse(systemId);
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLFilterImpl: Progressive parse methods
+// ---------------------------------------------------------------------------
+bool SAX2XMLFilterImpl::parseFirst( const   XMLCh* const    systemId
+                            ,       XMLPScanToken&  toFill)
+{
+    if(fParentReader)
+        return fParentReader->parseFirst(systemId, toFill);
+    return false;
+}
+
+bool SAX2XMLFilterImpl::parseFirst( const   char* const     systemId
+                            ,       XMLPScanToken&  toFill)
+{
+    if(fParentReader)
+        fParentReader->parseFirst(systemId, toFill);
+    return false;
+}
+
+bool SAX2XMLFilterImpl::parseFirst( const   InputSource&    source
+                            ,       XMLPScanToken&  toFill)
+{
+    if(fParentReader)
+        fParentReader->parseFirst(source, toFill);
+    return false;
+}
+
+bool SAX2XMLFilterImpl::parseNext(XMLPScanToken& token)
+{
+    if(fParentReader)
+        fParentReader->parseNext(token);
+    return false;
+}
+
+void SAX2XMLFilterImpl::parseReset(XMLPScanToken& token)
+{
+    if(fParentReader)
+        fParentReader->parseReset(token);
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLFilterImpl: Features and Properties
+// ---------------------------------------------------------------------------
+
+void SAX2XMLFilterImpl::setFeature(const XMLCh* const name, const bool value)
+{
+    if(fParentReader)
+        fParentReader->setFeature(name,value);
+}
+
+bool SAX2XMLFilterImpl::getFeature(const XMLCh* const name) const
+{
+    if(fParentReader)
+        return fParentReader->getFeature(name);
+    return false;
+}
+
+void SAX2XMLFilterImpl::setProperty(const XMLCh* const name, void* value)
+{
+    if(fParentReader)
+        fParentReader->setProperty(name,value);
+}
+
+void* SAX2XMLFilterImpl::getProperty(const XMLCh* const name) const
+{
+    if(fParentReader)
+        return fParentReader->getProperty(name);
+    return NULL;
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLFilterImpl: Grammar preparsing
+// ---------------------------------------------------------------------------
+Grammar* SAX2XMLFilterImpl::loadGrammar(const char* const systemId,
+                                        const short grammarType,
+                                        const bool toCache)
+{
+    if(fParentReader)
+        return fParentReader->loadGrammar(systemId, grammarType, toCache);
+    return NULL;
+}
+
+Grammar* SAX2XMLFilterImpl::loadGrammar(const XMLCh* const systemId,
+                                        const short grammarType,
+                                        const bool toCache)
+{
+    if(fParentReader)
+        return fParentReader->loadGrammar(systemId, grammarType, toCache);
+    return NULL;
+}
+
+Grammar* SAX2XMLFilterImpl::loadGrammar(const InputSource& source,
+                                        const short grammarType,
+                                        const bool toCache)
+{
+    if(fParentReader)
+        return fParentReader->loadGrammar(source, grammarType, toCache);
+    return NULL;
+}
+
+void SAX2XMLFilterImpl::resetCachedGrammarPool()
+{
+    if(fParentReader)
+        fParentReader->resetCachedGrammarPool();
+}
+
+void SAX2XMLFilterImpl::setInputBufferSize(const size_t bufferSize)
+{
+    if(fParentReader)
+        fParentReader->setInputBufferSize(bufferSize);
+}
+
+Grammar* SAX2XMLFilterImpl::getGrammar(const XMLCh* const nameSpaceKey)
+{
+    if(fParentReader)
+        return fParentReader->getGrammar(nameSpaceKey);
+    return NULL;
+}
+
+// -----------------------------------------------------------------------
+//  Implementation of the EntityResolver interface
+// -----------------------------------------------------------------------
+InputSource* SAX2XMLFilterImpl::resolveEntity(const XMLCh* const    publicId
+                                            , const XMLCh* const    systemId)
+{
+    if(fEntityResolver)
+        return fEntityResolver->resolveEntity(publicId, systemId);
+    return 0;
+}
+
+// -----------------------------------------------------------------------
+//  Implementation of the DTDHandler interface
+// -----------------------------------------------------------------------
+void SAX2XMLFilterImpl::notationDecl( const XMLCh* const    name
+                                    , const XMLCh* const    publicId
+                                    , const XMLCh* const    systemId)
+{
+    if(fDTDHandler)
+        fDTDHandler->notationDecl(name, publicId, systemId);
+}
+
+void SAX2XMLFilterImpl::unparsedEntityDecl(const XMLCh* const    name
+                                         , const XMLCh* const    publicId
+                                         , const XMLCh* const    systemId
+                                         , const XMLCh* const    notationName)
+{
+    if(fDTDHandler)
+        fDTDHandler->unparsedEntityDecl(name, publicId, systemId, notationName);
+}
+
+void SAX2XMLFilterImpl::resetDocType()
+{
+    if(fDTDHandler)
+        fDTDHandler->resetDocType();
+}
+
+// -----------------------------------------------------------------------
+//  Implementation of the ContentHandler interface
+// -----------------------------------------------------------------------
+
+void SAX2XMLFilterImpl::characters(const XMLCh* const    chars
+                                 , const unsigned int    length)
+{
+    if(fDocHandler)
+        fDocHandler->characters(chars, length);
+}
+
+void SAX2XMLFilterImpl::endDocument()
+{
+    if(fDocHandler)
+        fDocHandler->endDocument();
+}
+
+void SAX2XMLFilterImpl::endElement(const XMLCh* const uri
+		                         , const XMLCh* const localname
+		                         , const XMLCh* const qname)
+{
+    if(fDocHandler)
+        fDocHandler->endElement(uri, localname, qname);
+}
+
+void SAX2XMLFilterImpl::ignorableWhitespace(const XMLCh* const    chars
+                                          , const unsigned int    length)
+{
+    if(fDocHandler)
+        fDocHandler->ignorableWhitespace(chars, length);
+}
+
+void SAX2XMLFilterImpl::processingInstruction(const XMLCh* const    target
+                                            , const XMLCh* const    data)
+{
+    if(fDocHandler)
+        fDocHandler->processingInstruction(target, data);
+}
+
+void SAX2XMLFilterImpl::setDocumentLocator(const Locator* const locator)
+{
+    if(fDocHandler)
+        fDocHandler->setDocumentLocator(locator);
+}
+
+void SAX2XMLFilterImpl::startDocument()
+{
+    if(fDocHandler)
+        fDocHandler->startDocument();
+}
+
+void SAX2XMLFilterImpl::startElement(const   XMLCh* const    uri
+                                   , const   XMLCh* const    localname
+                                   , const   XMLCh* const    qname
+                                   , const   Attributes&     attrs)
+{
+    if(fDocHandler)
+        fDocHandler->startElement(uri, localname, qname, attrs);
+}
+
+void SAX2XMLFilterImpl::startPrefixMapping(const	XMLCh* const	prefix
+                                    	,  const	XMLCh* const	uri)
+{
+    if(fDocHandler)
+        fDocHandler->startPrefixMapping(prefix, uri);
+}
+
+void SAX2XMLFilterImpl::endPrefixMapping(const XMLCh* const	prefix)
+{
+    if(fDocHandler)
+        fDocHandler->endPrefixMapping(prefix);
+}
+
+void SAX2XMLFilterImpl::skippedEntity(const	XMLCh* const	name)
+{
+    if(fDocHandler)
+        fDocHandler->skippedEntity(name);
+}
+
+// -----------------------------------------------------------------------
+//  Implementation of the ErrorHandler interface
+// -----------------------------------------------------------------------
+
+void SAX2XMLFilterImpl::warning(const SAXParseException& exc)
+{
+    if(fErrorHandler)
+        fErrorHandler->warning(exc);
+}
+
+void SAX2XMLFilterImpl::error(const SAXParseException& exc)
+{
+    if(fErrorHandler)
+        fErrorHandler->error(exc);
+}
+
+void SAX2XMLFilterImpl::fatalError(const SAXParseException& exc)
+{
+    if(fErrorHandler)
+        fErrorHandler->fatalError(exc);
+}
+
+void SAX2XMLFilterImpl::resetErrors()
+{
+    if(fErrorHandler)
+        fErrorHandler->resetErrors();
+}
+
+XERCES_CPP_NAMESPACE_END
+
diff --git a/src/xercesc/parsers/SAX2XMLFilterImpl.hpp b/src/xercesc/parsers/SAX2XMLFilterImpl.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..465398a6d4d6b53ede9f86ecc46db82f70f2ac5d
--- /dev/null
+++ b/src/xercesc/parsers/SAX2XMLFilterImpl.hpp
@@ -0,0 +1,1450 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2004/12/24 19:21:46  amassari
+ * Add support for SAX2 filters (jira# 1133)
+ *
+ */
+
+#if !defined(SAX2XMLFilterImpl_HPP)
+#define SAX2XMLFilterImpl_HPP
+
+#include <xercesc/sax2/SAX2XMLFilter.hpp>
+#include <xercesc/sax/EntityResolver.hpp>
+#include <xercesc/sax/DTDHandler.hpp>
+#include <xercesc/sax2/ContentHandler.hpp>
+#include <xercesc/sax/ErrorHandler.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+/**
+  * This class implements the SAX2 'XMLFilterImpl' interface and should be
+  * used by applications as the base class for their SAX2 filters.
+  * This implementation simply forwards every call to the parent object.
+  *
+  */
+
+class PARSERS_EXPORT SAX2XMLFilterImpl : 
+    public SAX2XMLFilter
+    , public EntityResolver
+    , public DTDHandler
+    , public ContentHandler
+    , public ErrorHandler
+{
+public :
+    // -----------------------------------------------------------------------
+    //  Constructors and Destructor
+    // -----------------------------------------------------------------------
+    /** @name Constructors and Destructor */
+    //@{
+    /** The default constructor */
+	SAX2XMLFilterImpl(SAX2XMLReader* parent);
+
+    /** The destructor */	
+	~SAX2XMLFilterImpl() ;
+   //@}
+
+    //-----------------------------------------------------------------------
+    // Implementation of SAX2XMLReader Interface
+    //-----------------------------------------------------------------------
+    //-----------------------------------------------------------------------
+    // The XMLReader interface
+    //-----------------------------------------------------------------------
+    /** @name Implementation of SAX 2.0 XMLReader interface's. */
+    //@{
+
+    /**
+      * This method returns the installed content handler.
+      *
+      * @return A pointer to the installed content handler object.
+      */
+    virtual ContentHandler* getContentHandler() const ;
+
+    /**
+      * This method returns the installed DTD handler.
+      *
+      * @return A pointer to the installed DTD handler object.
+      */
+    virtual DTDHandler* getDTDHandler() const ;
+
+    /**
+      * This method returns the installed entity resolver.
+      *
+      * @return A pointer to the installed entity resolver object.
+      */
+    virtual EntityResolver* getEntityResolver() const ;
+
+    /**
+      * This method returns the installed error handler.
+      *
+      * @return A pointer to the installed error handler object.
+      */
+    virtual ErrorHandler* getErrorHandler() const ;
+
+	/**
+     * Query the current state of any feature in a SAX2 XMLReader.
+	  *
+	  * @param name The unique identifier (URI) of the feature being set.
+	  * @return The current state of the feature.
+     * @exception SAXNotRecognizedException If the requested feature is not known.
+	  */
+	virtual bool getFeature(const XMLCh* const name) const ;
+
+	/**
+     * Query the current value of a property in a SAX2 XMLReader.
+     *
+     * The parser owns the returned pointer.  The memory allocated for
+     * the returned pointer will be destroyed when the parser is deleted.
+     *
+     * To ensure assessiblity of the returned information after the parser
+     * is deleted, callers need to copy and store the returned information
+     * somewhere else; otherwise you may get unexpected result.  Since the returned
+     * pointer is a generic void pointer, see
+     * http://xml.apache.org/xerces-c/program-sax2.html#SAX2Properties to learn
+     * exactly what type of property value each property returns for replication.
+     *
+     * @param name The unique identifier (URI) of the property being set.
+     * @return     The current value of the property.  The pointer spans the same
+     *             life-time as the parser.  A null pointer is returned if nothing
+     *             was specified externally.
+     * @exception  SAXNotRecognizedException If the requested property is not known.
+     */
+	virtual void* getProperty(const XMLCh* const name) const ;
+
+  /**
+    * Allow an application to register a document event handler.
+    *
+    * If the application does not register a document handler, all
+    * document events reported by the SAX parser will be silently
+    * ignored (this is the default behaviour implemented by
+    * HandlerBase).
+    *
+    * Applications may register a new or different handler in the
+    * middle of a parse, and the SAX parser must begin using the new
+    * handler immediately.
+    *
+    * @param handler The document handler.
+    * @see DocumentHandler#DocumentHandler
+    * @see HandlerBase#HandlerBase
+    */
+    virtual void setContentHandler(ContentHandler* const handler) ;
+
+  /**
+    * Allow an application to register a DTD event handler.
+    *
+    * If the application does not register a DTD handler, all DTD
+    * events reported by the SAX parser will be silently ignored (this
+    * is the default behaviour implemented by HandlerBase).
+    *
+    * Applications may register a new or different handler in the middle
+    * of a parse, and the SAX parser must begin using the new handler
+    * immediately.
+    *
+    * @param handler The DTD handler.
+    * @see DTDHandler#DTDHandler
+    * @see HandlerBase#HandlerBase
+    */
+    virtual void setDTDHandler(DTDHandler* const handler) ;
+
+  /**
+    * Allow an application to register a custom entity resolver.
+    *
+    * If the application does not register an entity resolver, the
+    * SAX parser will resolve system identifiers and open connections
+    * to entities itself (this is the default behaviour implemented in
+    * DefaultHandler).
+    *
+    * Applications may register a new or different entity resolver
+    * in the middle of a parse, and the SAX parser must begin using
+    * the new resolver immediately.
+    *
+    * @param resolver The object for resolving entities.
+    * @see EntityResolver#EntityResolver
+    * @see DefaultHandler#DefaultHandler
+    */
+    virtual void setEntityResolver(EntityResolver* const resolver) ;
+    
+  /**
+    * Allow an application to register an error event handler.
+    *
+    * If the application does not register an error event handler,
+    * all error events reported by the SAX parser will be silently
+    * ignored, except for fatalError, which will throw a SAXException
+    * (this is the default behaviour implemented by HandlerBase).
+    *
+    * Applications may register a new or different handler in the
+    * middle of a parse, and the SAX parser must begin using the new
+    * handler immediately.
+    *
+    * @param handler The error handler.
+    * @see ErrorHandler#ErrorHandler
+    * @see SAXException#SAXException
+    * @see HandlerBase#HandlerBase
+    */
+    virtual void setErrorHandler(ErrorHandler* const handler) ;
+
+  /**
+    * Set the state of any feature in a SAX2 XMLReader.
+    * Supported features in SAX2 for xerces-c are:
+    * <br>(See http://xml.apache.org/xerces-c/program-sax2.html#SAX2Features for detail description).
+    *
+    * <br>http://xml.org/sax/features/validation (default: true)
+    * <br>http://xml.org/sax/features/namespaces (default: true)
+    * <br>http://xml.org/sax/features/namespace-prefixes (default: false)
+    * <br>http://apache.org/xml/features/validation/dynamic (default: false)
+    * <br>http://apache.org/xml/features/validation/reuse-grammar (default: false)
+    * <br>http://apache.org/xml/features/validation/schema (default: true)
+    * <br>http://apache.org/xml/features/validation/schema-full-checking (default: false)
+    * <br>http://apache.org/xml/features/nonvalidating/load-external-dtd (default: true)
+    * <br>http://apache.org/xml/features/continue-after-fatal-error (default: false)
+    * <br>http://apache.org/xml/features/validation-error-as-fatal (default: false)
+    * <br>http://apache.org/xml/features/validation/reuse-validator (Deprecated) (default: false)
+    *
+    * @param name The unique identifier (URI) of the feature.
+    * @param value The requested state of the feature (true or false).
+    * @exception SAXNotRecognizedException If the requested feature is not known.
+    * @exception SAXNotSupportedException Feature modification is not supported during parse
+    *
+    */
+	virtual void setFeature(const XMLCh* const name, const bool value) ;
+
+  /**
+    * Set the value of any property in a SAX2 XMLReader.
+    * Supported properties in SAX2 for xerces-c are:
+    * <br>(See http://xml.apache.org/xerces-c/program-sax2.html#SAX2Properties for detail description).
+    *
+    * <br>http://apache.org/xml/properties/schema/external-schemaLocation
+    * <br>http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation.
+    *
+    * It takes a void pointer as the property value.  Application is required to initialize this void
+    * pointer to a correct type.  See http://xml.apache.org/xerces-c/program-sax2.html#SAX2Properties
+    * to learn exactly what type of property value each property expects for processing.
+    * Passing a void pointer that was initialized with a wrong type will lead to unexpected result.
+    * If the same property is set more than once, the last one takes effect.
+    *
+    * @param name The unique identifier (URI) of the property being set.
+    * @param value The requested value for the property.  See
+    *            http://xml.apache.org/xerces-c/program-sax2.html#SAX2Properties to learn
+    *            exactly what type of property value each property expects for processing.
+    *            Passing a void pointer that was initialized with a wrong type will lead
+    *            to unexpected result.
+    * @exception SAXNotRecognizedException If the requested property is not known.
+    * @exception SAXNotSupportedException Property modification is not supported during parse
+    */
+	virtual void setProperty(const XMLCh* const name, void* value) ;
+
+  /**
+    * Parse an XML document.
+    *
+    * The application can use this method to instruct the SAX parser
+    * to begin parsing an XML document from any valid input
+    * source (a character stream, a byte stream, or a URI).
+    *
+    * Applications may not invoke this method while a parse is in
+    * progress (they should create a new Parser instead for each
+    * additional XML document).  Once a parse is complete, an
+    * application may reuse the same Parser object, possibly with a
+    * different input source.
+    *
+    * @param source The input source for the top-level of the
+    *               XML document.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @exception XMLException An exception from the parser or client
+    *            handler code.
+    * @see InputSource#InputSource
+    * @see #setEntityResolver
+    * @see #setDTDHandler
+    * @see #setDocumentHandler
+    * @see #setErrorHandler
+    */
+    virtual void parse
+    (
+        const   InputSource&    source
+    ) ;
+
+  /**
+    * Parse an XML document from a system identifier (URI).
+    *
+    * This method is a shortcut for the common case of reading a
+    * document from a system identifier.  It is the exact equivalent
+    * of the following:
+    *
+    * parse(new URLInputSource(systemId));
+    *
+    * If the system identifier is a URL, it must be fully resolved
+    * by the application before it is passed to the parser.
+    *
+    * @param systemId The system identifier (URI).
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @exception XMLException An exception from the parser or client
+    *            handler code.
+    * @see #parse(InputSource)
+    */
+    virtual void parse
+    (
+        const   XMLCh* const    systemId
+    ) ;
+
+  /**
+    * Parse an XML document from a system identifier (URI).
+    *
+    * This method is a shortcut for the common case of reading a
+    * document from a system identifier.  It is the exact equivalent
+    * of the following:
+    *
+    * parse(new URLInputSource(systemId));
+    *
+    * If the system identifier is a URL, it must be fully resolved
+    * by the application before it is passed to the parser.
+    *
+    * @param systemId The system identifier (URI).
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @exception XMLException An exception from the parser or client
+    *            handler code.
+    * @see #parse(InputSource)
+    */
+    virtual void parse
+    (
+        const   char* const     systemId
+    ) ;
+	
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  SAX 2.0-ext
+    // -----------------------------------------------------------------------
+    /** @name SAX 2.0-ext */
+    //@{
+    /**
+      * This method returns the installed declaration handler.
+      *
+      * @return A pointer to the installed declaration handler object.
+      */
+    virtual DeclHandler* getDeclarationHandler() const ;
+
+	/**
+      * This method returns the installed lexical handler.
+      *
+      * @return A pointer to the installed lexical handler object.
+      */
+    virtual LexicalHandler* getLexicalHandler() const ;
+
+   /**
+    * Allow an application to register a declaration event handler.
+    *
+    * If the application does not register a declaration handler,
+    * all events reported by the SAX parser will be silently
+    * ignored. (this is the default behaviour implemented by DefaultHandler).
+    *
+    * Applications may register a new or different handler in the
+    * middle of a parse, and the SAX parser must begin using the new
+    * handler immediately.
+    *
+    * @param handler The DTD declaration handler.
+    * @see DeclHandler#DeclHandler
+    * @see SAXException#SAXException
+    * @see DefaultHandler#DefaultHandler
+    */
+    virtual void setDeclarationHandler(DeclHandler* const handler) ;
+
+   /**
+    * Allow an application to register a lexical event handler.
+    *
+    * If the application does not register a lexical handler,
+    * all events reported by the SAX parser will be silently
+    * ignored. (this is the default behaviour implemented by HandlerBase).
+    *
+    * Applications may register a new or different handler in the
+    * middle of a parse, and the SAX parser must begin using the new
+    * handler immediately.
+    *
+    * @param handler The error handler.
+    * @see LexicalHandler#LexicalHandler
+    * @see SAXException#SAXException
+    * @see HandlerBase#HandlerBase
+    */
+    virtual void setLexicalHandler(LexicalHandler* const handler) ;
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Getter Methods
+    // -----------------------------------------------------------------------
+    /** @name Getter Methods (Xerces-C specific) */
+    //@{
+    /**
+	  * This method is used to get the current validator.
+	  *
+	  * <b>SAX2XMLReader assumes responsibility for the validator.  It will be
+	  * deleted when the XMLReader is destroyed.</b>
+	  *
+	  * @return A pointer to the validator.  An application should not deleted
+	  * the object returned.
+	  *
+	  */
+	virtual XMLValidator* getValidator() const ;
+
+    /** Get error count from the last parse operation.
+      *
+      * This method returns the error count from the last parse
+      * operation. Note that this count is actually stored in the
+      * scanner, so this method simply returns what the
+      * scanner reports.
+      *
+      * @return number of errors encountered during the latest
+      *			parse operation.
+      */
+    virtual int getErrorCount() const ;
+
+    /**
+      * This method returns the state of the parser's
+      * exit-on-First-Fatal-Error flag.
+      *
+      * <p>Or you can query the feature "http://apache.org/xml/features/continue-after-fatal-error"
+      * which indicates the opposite state.</p>
+      *
+      * @return true, if the parser is currently configured to
+      *         exit on the first fatal error, false otherwise.
+      *
+      * @see #setExitOnFirstFatalError
+      * @see #getFeature
+      */
+    virtual bool getExitOnFirstFatalError() const ;
+
+    /**
+      * This method returns the state of the parser's
+      * validation-constraint-fatal flag.
+      *
+      * <p>Or you can query the feature "http://apache.org/xml/features/validation-error-as-fatal"
+      * which means the same thing.
+      *
+      * @return true, if the parser is currently configured to
+      *         set validation constraint errors as fatal, false
+      *         otherwise.
+      *
+      * @see #setValidationContraintFatal
+      * @see #getFeature
+      */
+    virtual bool getValidationConstraintFatal() const ;
+
+    /**
+      * Retrieve the grammar that is associated with the specified namespace key
+      *
+      * @param  nameSpaceKey Namespace key
+      * @return Grammar associated with the Namespace key.
+      */
+    virtual Grammar* getGrammar(const XMLCh* const nameSpaceKey);
+
+    /**
+      * Retrieve the grammar where the root element is declared.
+      *
+      * @return Grammar where root element declared
+      */
+    virtual Grammar* getRootGrammar();
+
+    /**
+      * Returns the string corresponding to a URI id from the URI string pool.
+      *
+      * @param uriId id of the string in the URI string pool.
+      * @return URI string corresponding to the URI id.
+      */
+    virtual const XMLCh* getURIText(unsigned int uriId) const;
+
+    /**
+      * Returns the current src offset within the input source.
+      *
+      * @return offset within the input source
+      */
+    virtual unsigned int getSrcOffset() const;
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Setter Methods
+    // -----------------------------------------------------------------------
+    /** @name Setter Methods (Xerces-C specific) */
+    //@{
+    /**
+	  * This method is used to set a validator.
+	  *
+	  * <b>SAX2XMLReader assumes responsibility for the validator.  It will be
+	  * deleted when the XMLReader is destroyed.</b>
+	  *
+	  * @param valueToAdopt A pointer to the validator that the reader should use.
+	  *
+	  */
+	virtual void setValidator(XMLValidator* valueToAdopt) ;
+
+    /**
+      * This method allows users to set the parser's behaviour when it
+      * encounters the first fatal error. If set to true, the parser
+      * will exit at the first fatal error. If false, then it will
+      * report the error and continue processing.
+      *
+      * <p>The default value is 'true' and the parser exits on the
+      * first fatal error.</p>
+      *
+      * <p>Or you can set the feature "http://apache.org/xml/features/continue-after-fatal-error"
+      * which has the opposite behaviour.</p>
+      *
+      * <p>If both the feature above and this function are used, the latter takes effect.</p>
+      *
+      * @param newState The value specifying whether the parser should
+      *                 continue or exit when it encounters the first
+      *                 fatal error.
+      *
+      * @see #getExitOnFirstFatalError
+      * @see #setFeature
+      */
+    virtual void setExitOnFirstFatalError(const bool newState) ;
+
+    /**
+      * This method allows users to set the parser's behaviour when it
+      * encounters a validtion constraint error. If set to true, and the
+      * the parser will treat validation error as fatal and will exit depends on the
+      * state of "getExitOnFirstFatalError". If false, then it will
+      * report the error and continue processing.
+      *
+      * Note: setting this true does not mean the validation error will be printed with
+      * the word "Fatal Error".   It is still printed as "Error", but the parser
+      * will exit if "setExitOnFirstFatalError" is set to true.
+      *
+      * <p>The default value is 'false'.</p>
+      *
+      * <p>Or you can set the feature "http://apache.org/xml/features/validation-error-as-fatal"
+      * which means the same thing.</p>
+      *
+      * <p>If both the feature above and this function are used, the latter takes effect.</p>
+      *
+      * @param newState If true, the parser will exit if "setExitOnFirstFatalError"
+      *                 is set to true.
+      *
+      * @see #getValidationConstraintFatal
+      * @see #setExitOnFirstFatalError
+      * @see #setFeature
+      */
+    virtual void setValidationConstraintFatal(const bool newState) ;
+    //@}
+
+
+    // -----------------------------------------------------------------------
+    //  Progressive scan methods
+    // -----------------------------------------------------------------------
+
+    /** @name Progressive scan methods */
+    //@{
+
+    /** Begin a progressive parse operation
+      *
+      * This method is used to start a progressive parse on a XML file.
+      * To continue parsing, subsequent calls must be to the parseNext
+      * method.
+      *
+      * It scans through the prolog and returns a token to be used on
+      * subsequent scanNext() calls. If the return value is true, then the
+      * token is legal and ready for further use. If it returns false, then
+      * the scan of the prolog failed and the token is not going to work on
+      * subsequent scanNext() calls.
+      *
+      * @param systemId A pointer to a Unicode string represting the path
+      *                 to the XML file to be parsed.
+      * @param toFill   A token maintaing state information to maintain
+      *                 internal consistency between invocation of 'parseNext'
+      *                 calls.
+      *
+      * @return 'true', if successful in parsing the prolog. It indicates the
+      *         user can go ahead with parsing the rest of the file. It
+      *         returns 'false' to indicate that the parser could parse the
+      *         prolog (which means the token will not be valid.)
+      *
+      * @see #parseNext
+      * @see #parseFirst(char*,...)
+      * @see #parseFirst(InputSource&,...)
+      */
+    virtual bool parseFirst
+    (
+        const   XMLCh* const    systemId
+        ,       XMLPScanToken&  toFill
+    ) ;
+
+    /** Begin a progressive parse operation
+      *
+      * This method is used to start a progressive parse on a XML file.
+      * To continue parsing, subsequent calls must be to the parseNext
+      * method.
+      *
+      * It scans through the prolog and returns a token to be used on
+      * subsequent scanNext() calls. If the return value is true, then the
+      * token is legal and ready for further use. If it returns false, then
+      * the scan of the prolog failed and the token is not going to work on
+      * subsequent scanNext() calls.
+      *
+      * @param systemId A pointer to a regular native string represting
+      *                 the path to the XML file to be parsed.
+      * @param toFill   A token maintaing state information to maintain
+      *                 internal consIstency between invocation of 'parseNext'
+      *                 calls.
+      *
+      * @return 'true', if successful in parsing the prolog. It indicates the
+      *         user can go ahead with parsing the rest of the file. It
+      *         returns 'false' to indicate that the parser could not parse
+      *         the prolog.
+      *
+      * @see #parseNext
+      * @see #parseFirst(XMLCh*,...)
+      * @see #parseFirst(InputSource&,...)
+      */
+    virtual bool parseFirst
+    (
+        const   char* const     systemId
+        ,       XMLPScanToken&  toFill
+    ) ;
+
+    /** Begin a progressive parse operation
+      *
+      * This method is used to start a progressive parse on a XML file.
+      * To continue parsing, subsequent calls must be to the parseNext
+      * method.
+      *
+      * It scans through the prolog and returns a token to be used on
+      * subsequent scanNext() calls. If the return value is true, then the
+      * token is legal and ready for further use. If it returns false, then
+      * the scan of the prolog failed and the token is not going to work on
+      * subsequent scanNext() calls.
+      *
+      * @param source   A const reference to the InputSource object which
+      *                 points to the XML file to be parsed.
+      * @param toFill   A token maintaing state information to maintain
+      *                 internal consistency between invocation of 'parseNext'
+      *                 calls.
+      *
+      * @return 'true', if successful in parsing the prolog. It indicates the
+      *         user can go ahead with parsing the rest of the file. It
+      *         returns 'false' to indicate that the parser could not parse
+      *         the prolog.
+      *
+      * @see #parseNext
+      * @see #parseFirst(XMLCh*,...)
+      * @see #parseFirst(char*,...)
+      */
+    virtual bool parseFirst
+    (
+        const   InputSource&    source
+        ,       XMLPScanToken&  toFill
+    ) ;
+
+    /** Continue a progressive parse operation
+      *
+      * This method is used to continue with progressive parsing of
+      * XML files started by a call to 'parseFirst' method.
+      *
+      * It parses the XML file and stops as soon as it comes across
+      * a XML token (as defined in the XML specification). Relevant
+      * callback handlers are invoked as required by the SAX
+      * specification.
+      *
+      * @param token A token maintaing state information to maintain
+      *              internal consistency between invocation of 'parseNext'
+      *              calls.
+      *
+      * @return 'true', if successful in parsing the next XML token.
+      *         It indicates the user can go ahead with parsing the rest
+      *         of the file. It returns 'false' to indicate that the parser
+      *         could not find next token as per the XML specification
+      *         production rule.
+      *
+      * @see #parseFirst(XMLCh*,...)
+      * @see #parseFirst(char*,...)
+      * @see #parseFirst(InputSource&,...)
+      */
+    virtual bool parseNext(XMLPScanToken& token) ;
+
+    /** Reset the parser after a progressive parse
+      *
+      * If a progressive parse loop exits before the end of the document
+      * is reached, the parser has no way of knowing this. So it will leave
+      * open any files or sockets or memory buffers that were in use at
+      * the time that the parse loop exited.
+      *
+      * The next parse operation will cause these open files and such to
+      * be closed, but the next parse operation might occur at some unknown
+      * future point. To avoid this problem, you should reset the parser if
+      * you exit the loop early.
+      *
+      * If you exited because of an error, then this cleanup will be done
+      * for you. Its only when you exit the file prematurely of your own
+      * accord, because you've found what you wanted in the file most
+      * likely.
+      *
+      * @param token A token maintaing state information to maintain
+      *              internal consistency between invocation of 'parseNext'
+      *              calls.
+      */
+    virtual void parseReset(XMLPScanToken& token) ;
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Implementation of the grammar preparsing interface
+    // -----------------------------------------------------------------------
+
+    /** @name Implementation of Grammar preparsing interface's. */
+    //@{
+    /**
+      * Preparse schema grammar (XML Schema, DTD, etc.) via an input source
+      * object.
+      *
+      * This method invokes the preparsing process on a schema grammar XML
+      * file specified by the SAX InputSource parameter. If the 'toCache' flag
+      * is enabled, the parser will cache the grammars for re-use. If a grammar
+      * key is found in the pool, no caching of any grammar will take place.
+      *
+      * <p><b>"Experimental - subject to change"</b></p>
+      *
+      * @param source A const reference to the SAX InputSource object which
+      *               points to the schema grammar file to be preparsed.
+      * @param grammarType The grammar type (Schema or DTD).
+      * @param toCache If <code>true</code>, we cache the preparsed grammar,
+      *                otherwise, no chaching. Default is <code>false</code>.
+      * @return The preparsed schema grammar object (SchemaGrammar or
+      *         DTDGrammar). That grammar object is owned by the parser.
+      *
+      * @exception SAXException Any SAX exception, possibly
+      *            wrapping another exception.
+      * @exception XMLException An exception from the parser or client
+      *            handler code.
+      * @exception DOMException A DOM exception as per DOM spec.
+      *
+      * @see InputSource#InputSource
+      */
+    virtual Grammar* loadGrammar(const InputSource& source,
+                                 const short grammarType,
+                                 const bool toCache = false);
+
+    /**
+      * Preparse schema grammar (XML Schema, DTD, etc.) via a file path or URL
+      *
+      * This method invokes the preparsing process on a schema grammar XML
+      * file specified by the file path parameter. If the 'toCache' flag
+      * is enabled, the parser will cache the grammars for re-use. If a grammar
+      * key is found in the pool, no caching of any grammar will take place.
+      *
+      * <p><b>"Experimental - subject to change"</b></p>
+      *
+      * @param systemId A const XMLCh pointer to the Unicode string which
+      *                 contains the path to the XML grammar file to be
+      *                 preparsed.
+      * @param grammarType The grammar type (Schema or DTD).
+      * @param toCache If <code>true</code>, we cache the preparsed grammar,
+      *                otherwise, no chaching. Default is <code>false</code>.
+      * @return The preparsed schema grammar object (SchemaGrammar or
+      *         DTDGrammar). That grammar object is owned by the parser.
+      *
+      * @exception SAXException Any SAX exception, possibly
+      *            wrapping another exception.
+      * @exception XMLException An exception from the parser or client
+      *            handler code.
+      * @exception DOMException A DOM exception as per DOM spec.
+      */
+    virtual Grammar* loadGrammar(const XMLCh* const systemId,
+                                 const short grammarType,
+                                 const bool toCache = false);
+
+    /**
+      * Preparse schema grammar (XML Schema, DTD, etc.) via a file path or URL
+      *
+      * This method invokes the preparsing process on a schema grammar XML
+      * file specified by the file path parameter. If the 'toCache' flag
+      * is enabled, the parser will cache the grammars for re-use. If a grammar
+      * key is found in the pool, no caching of any grammar will take place.
+      *
+      * <p><b>"Experimental - subject to change"</b></p>
+      *
+      * @param systemId A const char pointer to a native string which contains
+      *                 the path to the XML grammar file to be preparsed.
+      * @param grammarType The grammar type (Schema or DTD).
+      * @param toCache If <code>true</code>, we cache the preparsed grammar,
+      *                otherwise, no chaching. Default is <code>false</code>.
+      * @return The preparsed schema grammar object (SchemaGrammar or
+      *         DTDGrammar). That grammar object is owned by the parser.
+      *
+      * @exception SAXException Any SAX exception, possibly
+      *            wrapping another exception.
+      * @exception XMLException An exception from the parser or client
+      *            handler code.
+      * @exception DOMException A DOM exception as per DOM spec.
+      */
+    virtual Grammar* loadGrammar(const char* const systemId,
+                                 const short grammarType,
+                                 const bool toCache = false);
+
+    /**
+      * Clear the cached grammar pool
+      */
+    virtual void resetCachedGrammarPool();
+
+    /** Set maximum input buffer size
+      *
+      * This method allows users to limit the size of buffers used in parsing
+      * XML character data. The effect of setting this size is to limit the
+      * size of a ContentHandler::characters() call.
+      *
+      * The parser's default input buffer size is 1 megabyte.
+      *
+      * @param bufferSize The maximum input buffer size
+      */
+    void setInputBufferSize(const size_t bufferSize);
+
+    //@}
+
+
+    // -----------------------------------------------------------------------
+    //  Advanced document handler list maintenance methods
+    // -----------------------------------------------------------------------
+
+    /** @name Advanced document handler list maintenance methods */
+    //@{
+    /**
+      * This method installs the specified 'advanced' document callback
+      * handler, thereby allowing the user to customize the processing,
+      * if they choose to do so. Any number of advanced callback handlers
+      * maybe installed.
+      *
+      * <p>The methods in the advanced callback interface represent
+      * Xerces-C extensions. There is no specification for this interface.</p>
+      *
+      * @param toInstall A pointer to the users advanced callback handler.
+      *
+      * @see #removeAdvDocHandler
+      */
+    virtual void installAdvDocHandler(XMLDocumentHandler* const toInstall) ;
+
+    /**
+      * This method removes the 'advanced' document handler callback from
+      * the underlying parser scanner. If no handler is installed, advanced
+      * callbacks are not invoked by the scanner.
+      * @param toRemove A pointer to the advanced callback handler which
+      *                 should be removed.
+      *
+      * @see #installAdvDocHandler
+      */
+    virtual bool removeAdvDocHandler(XMLDocumentHandler* const toRemove) ;
+    //@}
+
+
+    // -----------------------------------------------------------------------
+    //  The XMLFilter interface
+    // -----------------------------------------------------------------------
+
+    /** @name Implementation of SAX 2.0 XMLFilter interface's. */
+    //@{
+    /**
+      * This method returns the parent XMLReader object.
+      *
+      * @return A pointer to the parent XMLReader object.
+      */
+    virtual SAX2XMLReader* getParent() const;
+
+    /**
+      * Sets the parent XMLReader object; parse requests will be forwarded to this
+      * object, and callback notifications coming from it will be postprocessed
+      *
+      * @param parent The new XMLReader parent.
+      * @see SAX2XMLReader#SAX2XMLReader
+      */
+    virtual void setParent(SAX2XMLReader* parent);
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Implementation of the EntityResolver interface
+    // -----------------------------------------------------------------------
+    /** @name The EntityResolver interface */
+    //@{
+
+  /**
+    * Allow the application to resolve external entities.
+    *
+    * <p>The Parser will call this method before opening any external
+    * entity except the top-level document entity (including the
+    * external DTD subset, external entities referenced within the
+    * DTD, and external entities referenced within the document
+    * element): the application may request that the parser resolve
+    * the entity itself, that it use an alternative URI, or that it
+    * use an entirely different input source.</p>
+    *
+    * <p>Application writers can use this method to redirect external
+    * system identifiers to secure and/or local URIs, to look up
+    * public identifiers in a catalogue, or to read an entity from a
+    * database or other input source (including, for example, a dialog
+    * box).</p>
+    *
+    * <p>If the system identifier is a URL, the SAX parser must
+    * resolve it fully before reporting it to the application.</p>
+    *
+    * @param publicId The public identifier of the external entity
+    *        being referenced, or null if none was supplied.
+    * @param systemId The system identifier of the external entity
+    *        being referenced.
+    * @return An InputSource object describing the new input source,
+    *         or null to request that the parser open a regular
+    *         URI connection to the system identifier.
+    *         The returned InputSource is owned by the parser which is
+    *         responsible to clean up the memory.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @exception IOException An IO exception,
+    *            possibly the result of creating a new InputStream
+    *            or Reader for the InputSource.
+    * @see InputSource#InputSource
+    */
+    virtual InputSource* resolveEntity
+    (
+        const   XMLCh* const    publicId
+        , const XMLCh* const    systemId
+    );
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Implementation of the DTDHandler interface
+    // -----------------------------------------------------------------------
+    /** @name The DTD handler interface */
+    //@{
+  /**
+    * Receive notification of a notation declaration event.
+    *
+    * <p>It is up to the application to record the notation for later
+    * reference, if necessary.</p>
+    *
+    * <p>If a system identifier is present, and it is a URL, the SAX
+    * parser must resolve it fully before passing it to the
+    * application.</p>
+    *
+    * @param name The notation name.
+    * @param publicId The notation's public identifier, or null if
+    *        none was given.
+    * @param systemId The notation's system identifier, or null if
+    *        none was given.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see #unparsedEntityDecl
+    * @see AttributeList#AttributeList
+    */
+	virtual void notationDecl
+    (
+        const   XMLCh* const    name
+        , const XMLCh* const    publicId
+        , const XMLCh* const    systemId
+    );
+
+  /**
+    * Receive notification of an unparsed entity declaration event.
+    *
+    * <p>Note that the notation name corresponds to a notation
+    * reported by the notationDecl() event.  It is up to the
+    * application to record the entity for later reference, if
+    * necessary.</p>
+    *
+    * <p>If the system identifier is a URL, the parser must resolve it
+    * fully before passing it to the application.</p>
+    *
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @param name The unparsed entity's name.
+    * @param publicId The entity's public identifier, or null if none
+    *        was given.
+    * @param systemId The entity's system identifier (it must always
+    *        have one).
+    * @param notationName The name of the associated notation.
+    * @see #notationDecl
+    * @see AttributeList#AttributeList
+    */
+    virtual void unparsedEntityDecl
+    (
+        const   XMLCh* const    name
+        , const XMLCh* const    publicId
+        , const XMLCh* const    systemId
+        , const XMLCh* const    notationName
+    );
+
+    /**
+    * Reset the DocType object on its reuse
+    *
+    * <p>This method helps in reseting the DTD object implementational
+    * defaults each time the DTD is begun.</p>
+    *
+    */
+    virtual void resetDocType();
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Implementation of the ContentHandler interface
+    // -----------------------------------------------------------------------
+    /** @name The virtual document handler interface */
+
+    //@{
+   /**
+    * Receive notification of character data.
+    *
+    * <p>The Parser will call this method to report each chunk of
+    * character data.  SAX parsers may return all contiguous character
+    * data in a single chunk, or they may split it into several
+    * chunks; however, all of the characters in any single event
+    * must come from the same external entity, so that the Locator
+    * provides useful information.</p>
+    *
+    * <p>The application must not attempt to read from the array
+    * outside of the specified range.</p>
+    *
+    * <p>Note that some parsers will report whitespace using the
+    * ignorableWhitespace() method rather than this one (validating
+    * parsers must do so).</p>
+    *
+    * @param chars The characters from the XML document.
+    * @param length The number of characters to read from the array.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see #ignorableWhitespace
+    * @see Locator#Locator
+    */
+    virtual void characters
+    (
+        const   XMLCh* const    chars
+        , const unsigned int    length
+    );
+
+  /**
+    * Receive notification of the end of a document.
+    *
+    * <p>The SAX parser will invoke this method only once, and it will
+    * be the last method invoked during the parse.  The parser shall
+    * not invoke this method until it has either abandoned parsing
+    * (because of an unrecoverable error) or reached the end of
+    * input.</p>
+    *
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+    virtual void endDocument ();
+
+  /**
+    * Receive notification of the end of an element.
+    *
+    * <p>The SAX parser will invoke this method at the end of every
+    * element in the XML document; there will be a corresponding
+    * startElement() event for every endElement() event (even when the
+    * element is empty).</p>
+    *
+    * @param uri The URI of the asscioated namespace for this element
+	* @param localname The local part of the element name
+	* @param qname The QName of this element
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+    virtual void endElement
+	(
+		const XMLCh* const uri,
+		const XMLCh* const localname,
+		const XMLCh* const qname
+	);
+
+  /**
+    * Receive notification of ignorable whitespace in element content.
+    *
+    * <p>Validating Parsers must use this method to report each chunk
+    * of ignorable whitespace (see the W3C XML 1.0 recommendation,
+    * section 2.10): non-validating parsers may also use this method
+    * if they are capable of parsing and using content models.</p>
+    *
+    * <p>SAX parsers may return all contiguous whitespace in a single
+    * chunk, or they may split it into several chunks; however, all of
+    * the characters in any single event must come from the same
+    * external entity, so that the Locator provides useful
+    * information.</p>
+    *
+    * <p>The application must not attempt to read from the array
+    * outside of the specified range.</p>
+    *
+    * @param chars The characters from the XML document.
+    * @param length The number of characters to read from the array.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see #characters
+    */
+    virtual void ignorableWhitespace
+    (
+        const   XMLCh* const    chars
+        , const unsigned int    length
+    );
+
+  /**
+    * Receive notification of a processing instruction.
+    *
+    * <p>The Parser will invoke this method once for each processing
+    * instruction found: note that processing instructions may occur
+    * before or after the main document element.</p>
+    *
+    * <p>A SAX parser should never report an XML declaration (XML 1.0,
+    * section 2.8) or a text declaration (XML 1.0, section 4.3.1)
+    * using this method.</p>
+    *
+    * @param target The processing instruction target.
+    * @param data The processing instruction data, or null if
+    *        none was supplied.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+    virtual void processingInstruction
+    (
+        const   XMLCh* const    target
+        , const XMLCh* const    data
+    );
+
+  /**
+    * Receive an object for locating the origin of SAX document events.
+    *
+    * SAX parsers are strongly encouraged (though not absolutely
+    * required) to supply a locator: if it does so, it must supply
+    * the locator to the application by invoking this method before
+    * invoking any of the other methods in the DocumentHandler
+    * interface.
+    *
+    * The locator allows the application to determine the end
+    * position of any document-related event, even if the parser is
+    * not reporting an error.  Typically, the application will
+    * use this information for reporting its own errors (such as
+    * character content that does not match an application's
+    * business rules). The information returned by the locator
+    * is probably not sufficient for use with a search engine.
+    *
+    * Note that the locator will return correct information only
+    * during the invocation of the events in this interface. The
+    * application should not attempt to use it at any other time.
+    *
+    * @param locator An object that can return the location of
+    *                any SAX document event. The object is only
+    *                'on loan' to the client code and they are not
+    *                to attempt to delete or modify it in any way!
+    *
+    * @see Locator#Locator
+    */
+    virtual void setDocumentLocator(const Locator* const locator);
+
+  /**
+    * Receive notification of the beginning of a document.
+    *
+    * <p>The SAX parser will invoke this method only once, before any
+    * other methods in this interface or in DTDHandler (except for
+    * setDocumentLocator).</p>
+    *
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+    virtual void startDocument();
+
+  /**
+    * Receive notification of the beginning of an element.
+    *
+    * <p>The Parser will invoke this method at the beginning of every
+    * element in the XML document; there will be a corresponding
+    * endElement() event for every startElement() event (even when the
+    * element is empty). All of the element's content will be
+    * reported, in order, before the corresponding endElement()
+    * event.</p>
+    *
+    * <p>Note that the attribute list provided will
+    * contain only attributes with explicit values (specified or
+    * defaulted): #IMPLIED attributes will be omitted.</p>
+    *
+    * @param uri The URI of the asscioated namespace for this element
+	* @param localname The local part of the element name
+	* @param qname The QName of this element
+    * @param attrs The attributes attached to the element, if any.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see #endElement
+    * @see Attributes#Attributes
+    */
+    virtual void startElement
+    (
+        const   XMLCh* const    uri,
+        const   XMLCh* const    localname,
+        const   XMLCh* const    qname,
+        const   Attributes&     attrs
+    );
+
+  /**
+    * Receive notification of the start of an namespace prefix mapping.
+    *
+    * <p>By default, do nothing.  Application writers may override this
+    * method in a subclass to take specific actions at the start of
+    * each namespace prefix mapping.</p>
+    *
+    * @param prefix The namespace prefix used
+    * @param uri The namespace URI used.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+	virtual void startPrefixMapping
+	(
+		const	XMLCh* const	prefix,
+		const	XMLCh* const	uri
+	);
+
+  /**
+    * Receive notification of the end of an namespace prefix mapping.
+    *
+    * <p>By default, do nothing.  Application writers may override this
+    * method in a subclass to take specific actions at the end of
+    * each namespace prefix mapping.</p>
+    *
+    * @param prefix The namespace prefix used
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+	virtual void endPrefixMapping
+	(
+		const	XMLCh* const	prefix
+	);
+
+  /**
+    * Receive notification of a skipped entity
+    *
+    * <p>The parser will invoke this method once for each entity
+	* skipped.  All processors may skip external entities,
+	* depending on the values of the features:<br>
+	* http://xml.org/sax/features/external-general-entities<br>
+	* http://xml.org/sax/features/external-parameter-entities</p>
+	*
+	* <p>Note: Xerces (specifically) never skips any entities, regardless
+	* of the above features.  This function is never called in the
+	* Xerces implementation of SAX2.</p>
+    *
+	* <p>Introduced with SAX2</p>
+	*
+    * @param name The name of the skipped entity.  If it is a parameter entity,
+	* the name will begin with %, and if it is the external DTD subset,
+	* it will be the string [dtd].
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    */
+	virtual void skippedEntity
+	(
+		const	XMLCh* const	name
+	);
+
+    //@}
+
+    // -----------------------------------------------------------------------
+    //  Implementation of the ErrorHandler interface
+    // -----------------------------------------------------------------------
+    /** @name The error handler interface */
+    //@{
+   /**
+    * Receive notification of a warning.
+    *
+    * <p>SAX parsers will use this method to report conditions that
+    * are not errors or fatal errors as defined by the XML 1.0
+    * recommendation.  The default behaviour is to take no action.</p>
+    *
+    * <p>The SAX parser must continue to provide normal parsing events
+    * after invoking this method: it should still be possible for the
+    * application to process the document through to the end.</p>
+    *
+    * @param exc The warning information encapsulated in a
+    *            SAX parse exception.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see SAXParseException#SAXParseException
+    */
+    virtual void warning(const SAXParseException& exc);
+
+  /**
+    * Receive notification of a recoverable error.
+    *
+    * <p>This corresponds to the definition of "error" in section 1.2
+    * of the W3C XML 1.0 Recommendation.  For example, a validating
+    * parser would use this callback to report the violation of a
+    * validity constraint.  The default behaviour is to take no
+    * action.</p>
+    *
+    * <p>The SAX parser must continue to provide normal parsing events
+    * after invoking this method: it should still be possible for the
+    * application to process the document through to the end.  If the
+    * application cannot do so, then the parser should report a fatal
+    * error even if the XML 1.0 recommendation does not require it to
+    * do so.</p>
+    *
+    * @param exc The error information encapsulated in a
+    *            SAX parse exception.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see SAXParseException#SAXParseException
+    */
+    virtual void error(const SAXParseException& exc);
+
+  /**
+    * Receive notification of a non-recoverable error.
+    *
+    * <p>This corresponds to the definition of "fatal error" in
+    * section 1.2 of the W3C XML 1.0 Recommendation.  For example, a
+    * parser would use this callback to report the violation of a
+    * well-formedness constraint.</p>
+    *
+    * <p>The application must assume that the document is unusable
+    * after the parser has invoked this method, and should continue
+    * (if at all) only for the sake of collecting addition error
+    * messages: in fact, SAX parsers are free to stop reporting any
+    * other events once this method has been invoked.</p>
+    *
+    * @param exc The error information encapsulated in a
+    *            SAX parse exception.
+    * @exception SAXException Any SAX exception, possibly
+    *            wrapping another exception.
+    * @see SAXParseException#SAXParseException
+    */
+    virtual void fatalError(const SAXParseException& exc);
+
+    /**
+    * Reset the Error handler object on its reuse
+    *
+    * <p>This method helps in reseting the Error handler object
+    * implementational defaults each time the Error handler is begun.</p>
+    *
+    */
+    virtual void resetErrors();
+
+    //@}
+
+
+private :
+    // -----------------------------------------------------------------------
+    //  Unimplemented constructors and operators
+    // -----------------------------------------------------------------------
+    SAX2XMLFilterImpl(const SAX2XMLFilterImpl&);
+    SAX2XMLFilterImpl& operator=(const SAX2XMLFilterImpl&);
+
+    // -----------------------------------------------------------------------
+    //  Private data members
+    //
+    //  fParentReader
+    //      The object that we are filtering
+    //
+    //  fDocHandler
+    //      The installed SAX content handler, if any. Null if none.
+    //
+    //  fDTDHandler
+    //      The installed SAX DTD handler, if any. Null if none.
+    //
+    //  fEntityResolver
+    //      The installed SAX entity handler, if any. Null if none.
+    //
+    //  fErrorHandler
+    //      The installed SAX error handler, if any. Null if none.
+    //
+    // -----------------------------------------------------------------------
+    SAX2XMLReader*              fParentReader;
+    ContentHandler*		        fDocHandler;
+    DTDHandler*                 fDTDHandler;
+    EntityResolver*             fEntityResolver;
+    ErrorHandler*               fErrorHandler;
+};
+
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLReader: Getter methods
+// ---------------------------------------------------------------------------
+inline SAX2XMLReader* SAX2XMLFilterImpl::getParent() const
+{
+    return fParentReader;
+}
+
+inline ContentHandler* SAX2XMLFilterImpl::getContentHandler() const
+{
+    return fDocHandler;
+}
+
+inline DTDHandler* SAX2XMLFilterImpl::getDTDHandler() const
+{
+	return fDTDHandler;
+}
+
+inline EntityResolver* SAX2XMLFilterImpl::getEntityResolver() const
+{
+	return fEntityResolver;
+}
+
+inline ErrorHandler* SAX2XMLFilterImpl::getErrorHandler() const
+{
+	return fErrorHandler;
+}
+
+inline LexicalHandler* SAX2XMLFilterImpl::getLexicalHandler() const
+{
+   return 0;
+}
+
+inline DeclHandler* SAX2XMLFilterImpl::getDeclarationHandler() const
+{
+   return 0;
+}
+
+inline void SAX2XMLFilterImpl::setContentHandler(ContentHandler* const handler)
+{
+	fDocHandler = handler;
+}
+
+inline void SAX2XMLFilterImpl::setDTDHandler(DTDHandler* const handler)
+{
+    fDTDHandler = handler;
+}
+
+inline void SAX2XMLFilterImpl::setErrorHandler(ErrorHandler* const handler)
+{
+    fErrorHandler = handler;
+}
+
+inline void SAX2XMLFilterImpl::setEntityResolver(EntityResolver* const resolver)
+{
+    fEntityResolver = resolver;
+}
+
+inline void SAX2XMLFilterImpl::setLexicalHandler(LexicalHandler* const handler)
+{
+}
+
+inline void SAX2XMLFilterImpl::setDeclarationHandler(DeclHandler* const handler)
+{
+}
+
+inline void SAX2XMLFilterImpl::installAdvDocHandler(XMLDocumentHandler* const toInstall)
+{
+}
+
+inline bool SAX2XMLFilterImpl::removeAdvDocHandler(XMLDocumentHandler* const toRemove)
+{
+    return false;
+}
+
+XERCES_CPP_NAMESPACE_END
+
+#endif
diff --git a/src/xercesc/sax2/Makefile.in b/src/xercesc/sax2/Makefile.in
index 2431e208f63f035f41f10126d7597684eb9c8203..030d872309bdd6d7dc46bd1dd4c7fb62c9b05da3 100644
--- a/src/xercesc/sax2/Makefile.in
+++ b/src/xercesc/sax2/Makefile.in
@@ -47,6 +47,7 @@ SAX2_CPP_PUBHEADERS = \
 	LexicalHandler.hpp \
 	DeclHandler.hpp \
 	SAX2XMLReader.hpp \
+	SAX2XMLFilter.hpp \
 	XMLReaderFactory.hpp
 
 SAX2_CPP_PRIVHEADERS =
diff --git a/src/xercesc/sax2/SAX2XMLFilter.hpp b/src/xercesc/sax2/SAX2XMLFilter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4be3db3bd356d2b70bca71906b24edc98c911e75
--- /dev/null
+++ b/src/xercesc/sax2/SAX2XMLFilter.hpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright 1999-2001,2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2004/12/24 19:21:46  amassari
+ * Add support for SAX2 filters (jira# 1133)
+ *
+ */
+
+#ifndef SAX2XMLFilter_HPP
+#define SAX2XMLFilter_HPP
+
+#include <xercesc/sax2/SAX2XMLReader.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+class SAX2_EXPORT SAX2XMLFilter : public SAX2XMLReader
+{
+public:
+    // -----------------------------------------------------------------------
+    //  Constructors and Destructor
+    // -----------------------------------------------------------------------
+    /** @name Constructors and Destructor */
+    //@{
+    /** The default constructor */
+    SAX2XMLFilter()
+    {
+    }
+    /** The destructor */
+    virtual ~SAX2XMLFilter()
+    {
+    }
+    //@}
+
+    //-----------------------------------------------------------------------
+    // The XMLFilter interface
+    //-----------------------------------------------------------------------
+    /** @name Implementation of SAX 2.0 XMLFilter interface's. */
+    //@{
+
+    /**
+      * This method returns the parent XMLReader object.
+      *
+      * @return A pointer to the parent XMLReader object.
+      */
+    virtual SAX2XMLReader* getParent() const = 0 ;
+
+    /**
+      * Sets the parent XMLReader object; parse requests will be forwarded to this
+      * object, and callback notifications coming from it will be postprocessed
+      *
+      * @param parent The new XMLReader parent.
+      * @see SAX2XMLReader#SAX2XMLReader
+      */
+    virtual void setParent(SAX2XMLReader* parent) = 0;
+
+    //@}
+
+private :
+    /* The copy constructor, you cannot call this directly */
+    SAX2XMLFilter(const SAX2XMLFilter&);
+
+    /* The assignment operator, you cannot call this directly */
+    SAX2XMLFilter& operator=(const SAX2XMLFilter&);
+
+};
+
+XERCES_CPP_NAMESPACE_END
+
+#endif