diff --git a/src/xercesc/internal/XTemplateSerializer.cpp b/src/xercesc/internal/XTemplateSerializer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7a2ef41a9ea2510233f986358a59ac52c8fe467f
--- /dev/null
+++ b/src/xercesc/internal/XTemplateSerializer.cpp
@@ -0,0 +1,1772 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written
+ *    permission, please contact apache\@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+/*
+ * $Id$
+ * $Log$
+ * Revision 1.1  2003/10/17 21:07:49  peiyongz
+ * To support Template object serialization/deserialization
+ *
+ *
+ */
+
+
+// ---------------------------------------------------------------------------
+//  Includes
+// ---------------------------------------------------------------------------
+#include <xercesc/internal/XSerializeEngine.hpp>
+#include <xercesc/internal/XTemplateSerializer.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+/**********************************************************
+ *
+ * ValueVectorOf
+ *
+ *   SchemaElementDecl*
+ *   unsigned int
+ *
+ ***********************************************************/   
+void XTemplateSerializer::storeObject(ValueVectorOf<SchemaElementDecl*>* const objToStore
+                                    , XSerializeEngine&                        serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorSize = objToStore->size();
+        serEng<<vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {            
+            SchemaElementDecl*& data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(ValueVectorOf<SchemaElementDecl*>**       objToLoad
+                                   , int                                       initSize
+                                   , bool                                      toCallDestructor
+                                   , XSerializeEngine&                         serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             ValueVectorOf<SchemaElementDecl*>(
+                                                               initSize
+                                                             , serEng.getMemoryManager()
+                                                             , toCallDestructor
+                                                             );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorSize = 0;
+        serEng>>vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {
+            SchemaElementDecl* data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(ValueVectorOf<unsigned int>* const objToStore
+                                    , XSerializeEngine&                  serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorSize = objToStore->size();
+        serEng<<vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {            
+            unsigned int& data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(ValueVectorOf<unsigned int>**       objToLoad
+                                   , int                                 initSize
+                                   , bool                                toCallDestructor
+                                   , XSerializeEngine&                   serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             ValueVectorOf<unsigned int>(
+                                                         initSize
+                                                       , serEng.getMemoryManager()
+                                                       , toCallDestructor
+                                                       );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorSize = 0;
+        serEng>>vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {
+            unsigned int data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+/**********************************************************
+ *
+ * RefArrayVectorOf
+ *
+ *   XMLCh
+ *
+ ***********************************************************/
+
+void XTemplateSerializer::storeObject(RefArrayVectorOf<XMLCh>* const objToStore
+                                    , XSerializeEngine&              serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorSize = objToStore->size();
+        serEng<<vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {            
+            serEng.writeString(objToStore->elementAt(i));
+        }
+    }
+    
+}
+
+void XTemplateSerializer::loadObject(RefArrayVectorOf<XMLCh>**  objToLoad
+                                   , int                        initSize
+                                   , bool                       toAdopt
+                                   , XSerializeEngine&          serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefArrayVectorOf<XMLCh>(
+                                                     initSize
+                                                   , toAdopt
+                                                   , serEng.getMemoryManager()
+                                                   );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorSize = 0;
+        serEng>>vectorSize;
+
+        for ( int i = 0; i < vectorSize; i++)
+        {
+            XMLCh* data;
+            serEng.readString(data);
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+/**********************************************************
+ *
+ * RefVectorOf
+ *
+ *   SchemaAttDef
+ *   SchemaElementDecl
+ *   ContentSpecNode
+ *   IC_Field
+ *   DatatypeValidator
+ *   IdentityConstraint
+ *   XMLNumber
+ *   XercesLocationPath
+ *   XercesStep
+ *
+ ***********************************************************/
+
+void XTemplateSerializer::storeObject(RefVectorOf<SchemaAttDef>* const objToStore
+                                    , XSerializeEngine&                serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            SchemaAttDef* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<SchemaAttDef>** objToLoad
+                                   , int                         initSize
+                                   , bool                        toAdopt
+                                   , XSerializeEngine&           serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<SchemaAttDef>(
+                                                       initSize
+                                                     , toAdopt
+                                                     , serEng.getMemoryManager()
+                                                     );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            SchemaAttDef* data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<SchemaElementDecl>* const objToStore
+                                    , XSerializeEngine&                     serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            SchemaElementDecl* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<SchemaElementDecl>** objToLoad
+                                   , int                              initSize
+                                   , bool                             toAdopt
+                                   , XSerializeEngine&                serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<SchemaElementDecl>(
+                                                            initSize
+                                                          , toAdopt
+                                                          , serEng.getMemoryManager()
+                                                          );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            SchemaElementDecl* data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<ContentSpecNode>* const objToStore
+                                    , XSerializeEngine&                   serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            ContentSpecNode* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<ContentSpecNode>** objToLoad
+                                   , int                            initSize
+                                   , bool                           toAdopt
+                                   , XSerializeEngine&              serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<ContentSpecNode>(
+                                                          initSize
+                                                        , toAdopt
+                                                        , serEng.getMemoryManager()
+                                                        );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            ContentSpecNode* data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<IC_Field>* const objToStore
+                                    , XSerializeEngine&            serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            IC_Field* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<IC_Field>** objToLoad
+                                   , int                     initSize
+                                   , bool                    toAdopt
+                                   , XSerializeEngine&       serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<IC_Field>(
+                                                   initSize
+                                                 , toAdopt
+                                                 , serEng.getMemoryManager()
+                                                 );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            IC_Field* data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<DatatypeValidator>* const objToStore
+                                    , XSerializeEngine&                      serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            DatatypeValidator* data = objToStore->elementAt(i);
+            DatatypeValidator::storeDV(serEng, data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<DatatypeValidator>** objToLoad
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<DatatypeValidator>(
+                                                            initSize
+                                                          , toAdopt
+                                                          , serEng.getMemoryManager()
+                                                           );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            DatatypeValidator*  data;
+            data = DatatypeValidator::loadDV(serEng);
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<IdentityConstraint>* const objToStore
+                                    , XSerializeEngine&                       serEng)
+{ 
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            IdentityConstraint* data = objToStore->elementAt(i);
+            IdentityConstraint::storeIC(serEng, data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<IdentityConstraint>** objToLoad
+                                   , int                                initSize
+                                   , bool                               toAdopt
+                                   , XSerializeEngine&                  serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<IdentityConstraint>(
+                                                             initSize
+                                                           , toAdopt
+                                                           , serEng.getMemoryManager()
+                                                            );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            IdentityConstraint*  data;
+            data = IdentityConstraint::loadIC(serEng);
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<XMLNumber>* const objToStore
+                                    , XSerializeEngine&             serEng)
+{ 
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            XMLNumber* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<XMLNumber>** objToLoad
+                                   , int                       initSize
+                                   , bool                      toAdopt
+                                   , XMLNumber::NumberType     numType
+                                   , XSerializeEngine&         serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<XMLNumber>(
+                                                    initSize
+                                                  , toAdopt
+                                                  , serEng.getMemoryManager()
+                                                   );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            XMLNumber*  data;
+            data = XMLNumber::loadNumber(numType , serEng);
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<XercesLocationPath>* const objToStore
+                                    , XSerializeEngine&                      serEng)
+{ 
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            XercesLocationPath* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<XercesLocationPath>** objToLoad
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<XercesLocationPath>(
+                                                             initSize
+                                                           , toAdopt
+                                                           , serEng.getMemoryManager()
+                                                            );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            XercesLocationPath*  data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefVectorOf<XercesStep>* const objToStore
+                                    , XSerializeEngine&              serEng)
+{ 
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int vectorLength = objToStore->size();
+        serEng<<vectorLength;
+
+        for ( int i = 0; i < vectorLength; i++)
+        {
+            XercesStep* data = objToStore->elementAt(i);
+            serEng<<data;
+        }
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefVectorOf<XercesStep>** objToLoad
+                                   , int                       initSize
+                                   , bool                      toAdopt
+                                   , XSerializeEngine&         serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefVectorOf<XercesStep>(
+                                                     initSize
+                                                   , toAdopt
+                                                   , serEng.getMemoryManager()
+                                                    );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int vectorLength = 0;
+        serEng>>vectorLength;
+        for ( int i = 0 ; i < vectorLength; i++)
+        {            
+            XercesStep*  data;
+            serEng>>data;
+            (*objToLoad)->addElement(data);
+        }
+    }
+
+}
+
+/**********************************************************
+ *
+ * RefHasbTableOf
+ *
+ *   KVStringPair
+ *   XMLAttDef
+ *   DTDAttDef
+ *   ComplexTypeInfo
+ *   XercesGroupInfo
+ *   XercesAttGroupInfo
+ *   XMLRefInfo
+ *   DatatypeValidator
+ *
+ ***********************************************************/
+void XTemplateSerializer::storeObject(RefHashTableOf<KVStringPair>* const objToStore
+                                    , XSerializeEngine&                    serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<KVStringPair> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            KVStringPair* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<KVStringPair>** objToLoad
+                                   , int                            initSize
+                                   , bool                           toAdopt
+                                   , XSerializeEngine&              serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<KVStringPair>(
+                                                          initSize
+                                                        , toAdopt
+                                                        , serEng.getMemoryManager()
+                                                         );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            KVStringPair*  data;
+            serEng>>data;
+            
+            (*objToLoad)->put((void*)key, data);        
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<XMLAttDef>* const objToStore
+                                    , XSerializeEngine&                serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<XMLAttDef> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            XMLAttDef* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<XMLAttDef>** objToLoad
+                                   , int                         initSize
+                                   , bool                        toAdopt
+                                   , XSerializeEngine&           serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<XMLAttDef>(
+                                                       initSize
+                                                     , toAdopt
+                                                     , serEng.getMemoryManager()
+                                                      );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            //This is used solely by SchemaGrammar and by all means it must be
+            //SchemaAttDef, ideally we may change it to RefHashTableOf<SchemaAttDef>
+            //later on.
+            //Affected files IGXMLScanner, SGXMLScanner, SchemaGrammar, TraverseSchema
+            //XMLAttDef*  data;
+            SchemaAttDef*  data;
+            serEng>>data;
+            
+            (*objToLoad)->put((void*)key, data);        
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<DTDAttDef>* const objToStore
+                                    , XSerializeEngine&                serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<DTDAttDef> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            DTDAttDef* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<DTDAttDef>** objToLoad
+                                   , int                         initSize
+                                   , bool                        toAdopt
+                                   , XSerializeEngine&           serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<DTDAttDef>(
+                                                       initSize
+                                                     , toAdopt
+                                                     , serEng.getMemoryManager()
+                                                      );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            DTDAttDef*  data;
+            serEng>>data;
+            
+            //key==data->getFullName()
+            (*objToLoad)->put((void*)key, data);        
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<ComplexTypeInfo>* const objToStore
+                                    , XSerializeEngine&                      serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<ComplexTypeInfo> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            ComplexTypeInfo* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<ComplexTypeInfo>** objToLoad
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<ComplexTypeInfo>(
+                                                             initSize
+                                                           , toAdopt
+                                                           , serEng.getMemoryManager()
+                                                           );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            ComplexTypeInfo*  data;
+            serEng>>data;
+
+            //key==data->getTypeName()    
+            (*objToLoad)->put((void*)key, data);
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<XercesGroupInfo>* const objToStore
+                                    , XSerializeEngine&                      serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<XercesGroupInfo> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            XercesGroupInfo* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<XercesGroupInfo>** objToLoad
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<XercesGroupInfo>(
+                                                             initSize
+                                                           , toAdopt
+                                                           , serEng.getMemoryManager()
+                                                           );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            XercesGroupInfo*  data;
+            serEng>>data;
+
+            (*objToLoad)->put((void*)key, data);
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<XercesAttGroupInfo>* const objToStore
+                                    , XSerializeEngine&                         serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<XercesAttGroupInfo> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            XercesAttGroupInfo* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<XercesAttGroupInfo>** objToLoad
+                                   , int                                  initSize
+                                   , bool                                 toAdopt
+                                   , XSerializeEngine&                    serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<XercesAttGroupInfo>(
+                                                                initSize
+                                                              , toAdopt
+                                                              , serEng.getMemoryManager()
+                                                              );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            XercesAttGroupInfo*  data;
+            serEng>>data;
+
+            (*objToLoad)->put((void*)key, data);
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<XMLRefInfo>* const objToStore
+                                    , XSerializeEngine&                 serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<XMLRefInfo> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            XMLRefInfo* data = objToStore->get(key);
+            serEng<<data;
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<XMLRefInfo>** objToLoad
+                                   , int                          initSize
+                                   , bool                         toAdopt
+                                   , XSerializeEngine&            serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<XMLRefInfo>(
+                                                        initSize
+                                                      , toAdopt
+                                                      , serEng.getMemoryManager()
+                                                      );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            XMLRefInfo*  data;
+            serEng>>data;
+
+            (*objToLoad)->put((void*)key, data);
+        }
+    }
+}
+
+void XTemplateSerializer::storeObject(RefHashTableOf<DatatypeValidator>* const objToStore
+                                    , XSerializeEngine&                        serEng)                                          
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        RefHashTableOfEnumerator<DatatypeValidator> e(objToStore);
+        int itemNumber = 0;        
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key  = (XMLCh*) e.nextElementKey();
+            serEng.writeString(key);
+
+            DatatypeValidator* data = objToStore->get(key);
+            DatatypeValidator::storeDV(serEng, data);
+        }
+    }
+}
+
+void XTemplateSerializer::loadObject(RefHashTableOf<DatatypeValidator>** objToLoad
+                                   , int                                 initSize
+                                   , bool                                toAdopt
+                                   , XSerializeEngine&                   serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHashTableOf<DatatypeValidator>(
+                                                               initSize
+                                                             , toAdopt
+                                                             , serEng.getMemoryManager()
+                                                             );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {
+            XMLCh*      key;
+            serEng.readString(key);
+
+            DatatypeValidator*  data;
+            data = DatatypeValidator::loadDV(serEng);
+
+            (*objToLoad)->put((void*)key, data);
+        }
+    }
+}
+
+
+/**********************************************************
+ *
+ * RefHash2KeysTableOf
+ *
+ *   SchemaAttDef
+ *   ElemVector
+ *
+ ***********************************************************/
+void XTemplateSerializer::storeObject(RefHash2KeysTableOf<SchemaAttDef>* const objToStore
+                                    , XSerializeEngine&                        serEng)
+{ 
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+
+        RefHash2KeysTableOfEnumerator<SchemaAttDef> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key1;
+            int        key2;
+            
+            e.nextElementKey((void*&)key1, key2);
+            serEng.writeString(key1);
+            serEng<<key2;
+
+            XMLAttDef* data = objToStore->get(key1, key2);
+            serEng<<data;
+
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefHash2KeysTableOf<SchemaAttDef>** objToLoad
+                                   , int                                 initSize
+                                   , bool                                toAdopt
+                                   , XSerializeEngine&                   serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefHash2KeysTableOf<SchemaAttDef>(
+                                                               initSize
+                                                             , toAdopt
+                                                             , serEng.getMemoryManager()
+                                                             );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            XMLCh*      key1;
+            serEng.readString(key1);
+
+            int         key2;
+            serEng>>key2;
+
+            SchemaAttDef*  data;
+            serEng>>data;
+
+            //key1==data->getAttName()->getLocalPart()
+            //key2==data->getId()
+            (*objToLoad)->put((void*)key1, key2, data);        
+
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::storeObject(RefHash2KeysTableOf<ElemVector>* const objToStore
+                                    , XSerializeEngine&                      serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+
+        RefHash2KeysTableOfEnumerator<ElemVector> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLCh*     key1;
+            int        key2;
+            
+            e.nextElementKey((void*&)key1, key2);
+            serEng.writeString(key1);
+            serEng<<key2;
+
+            ElemVector* data = objToStore->get(key1, key2);
+
+            storeObject(data, serEng);
+
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefHash2KeysTableOf<ElemVector>**      objToLoad
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             RefHash2KeysTableOf<ElemVector>(
+                                                               initSize
+                                                             , toAdopt
+                                                             , serEng.getMemoryManager()
+                                                             );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            XMLCh*      key1;
+            serEng.readString(key1);
+
+            int         key2;
+            serEng>>key2;
+
+            ElemVector*  data;
+
+            loadObject(&data, 8, false, serEng);
+
+            (*objToLoad)->put((void*)key1, key2, data);        
+
+        }
+
+    }
+}
+
+/**********************************************************
+ *
+ * RefHash3KeysIdPool
+ *
+ *   SchemaElementDecl
+ *
+ ***********************************************************/
+void XTemplateSerializer::storeObject(RefHash3KeysIdPool<SchemaElementDecl>* const objToStore
+                                    , XSerializeEngine&                            serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+        RefHash3KeysIdPoolEnumerator<SchemaElementDecl> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            //there is no e.nextElementKey() for RefHash3KeysIdPoolEnumerator
+            SchemaElementDecl& attDef = e.nextElement();
+            attDef.serialize(serEng);
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(RefHash3KeysIdPool<SchemaElementDecl>** objToLoad
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , int                                     initSize2
+                                   , XSerializeEngine&                       serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             RefHash3KeysIdPool<SchemaElementDecl>(
+                                                                   initSize
+                                                                 , toAdopt
+                                                                 , initSize2
+                                                                 , serEng.getMemoryManager());
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            SchemaElementDecl*  elemDecl = new (serEng.getMemoryManager()) 
+                                           SchemaElementDecl(serEng.getMemoryManager());
+            elemDecl->serialize(serEng);
+            (*objToLoad)->put(elemDecl->getBaseName()
+                            , elemDecl->getURI()
+                            , elemDecl->getEnclosingScope()
+                            , elemDecl);
+        }
+   
+    }
+
+}
+
+/**********************************************************
+ *
+ * NameIdPool             
+ *    no NameIdPool::nextElementKey()
+ *
+ *   DTDElementDecl
+ *   DTDEntityDecl
+ *   XMLNotationDecl
+ *
+ ***********************************************************/
+void XTemplateSerializer::storeObject(NameIdPool<DTDElementDecl>* const objToStore
+                                    , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+        NameIdPoolEnumerator<DTDElementDecl> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            DTDElementDecl& data = e.nextElement();
+            data.serialize(serEng);
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(NameIdPool<DTDElementDecl>** objToLoad
+                                   , int                          initSize
+                                   , int                          initSize2
+                                   , XSerializeEngine&            serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager())
+                             NameIdPool<DTDElementDecl>(
+                                                        initSize
+                                                      , initSize2
+                                                      , serEng.getMemoryManager()
+                                                      );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            DTDElementDecl*  data = new (serEng.getMemoryManager())
+                                    DTDElementDecl(serEng.getMemoryManager());
+            data->serialize(serEng);
+            (*objToLoad)->put(data);
+        }
+   
+    }
+
+}
+
+void XTemplateSerializer::storeObject(NameIdPool<DTDEntityDecl>* const objToStore
+                                    , XSerializeEngine&                 serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+        NameIdPoolEnumerator<DTDEntityDecl> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            DTDEntityDecl& data = e.nextElement();
+            data.serialize(serEng);
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(NameIdPool<DTDEntityDecl>** objToLoad
+                                   , int                          initSize
+                                   , int                          initSize2
+                                   , XSerializeEngine&            serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             NameIdPool<DTDEntityDecl>(
+                                                       initSize
+                                                     , initSize2
+                                                     , serEng.getMemoryManager()
+                                                     );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            DTDEntityDecl*  data = new (serEng.getMemoryManager()) 
+                                   DTDEntityDecl(serEng.getMemoryManager());
+            data->serialize(serEng);
+            (*objToLoad)->put(data);
+        }
+   
+    }
+
+}
+
+void XTemplateSerializer::storeObject(NameIdPool<XMLNotationDecl>* const objToStore
+                                    , XSerializeEngine&                  serEng)
+{
+
+    if (serEng.needToStoreObject(objToStore))
+    {
+        int itemNumber = 0;
+        NameIdPoolEnumerator<XMLNotationDecl> e(objToStore);
+
+        while (e.hasMoreElements())
+        {
+            e.nextElement();
+            itemNumber++;
+        }
+
+        serEng<<itemNumber;
+        e.Reset();
+
+        while (e.hasMoreElements())
+        {
+            XMLNotationDecl& data = e.nextElement();
+            data.serialize(serEng);
+        }
+
+    }
+
+}
+
+void XTemplateSerializer::loadObject(NameIdPool<XMLNotationDecl>** objToLoad
+                                   , int                          initSize
+                                   , int                          initSize2
+                                   , XSerializeEngine&            serEng)
+{
+
+    if (serEng.needToLoadObject((void**)objToLoad))
+    {
+        if (!*objToLoad)
+        {
+            if (initSize < 0)
+                initSize = 16;
+
+            *objToLoad = new (serEng.getMemoryManager()) 
+                             NameIdPool<XMLNotationDecl>(
+                                                         initSize
+                                                       , initSize2
+                                                       , serEng.getMemoryManager()
+                                                       );
+        }
+
+        serEng.registerObject(*objToLoad);
+
+        int itemNumber = 0;
+        serEng>>itemNumber;
+
+        for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++)
+        {               
+            XMLNotationDecl*  data = new (serEng.getMemoryManager()) 
+                                     XMLNotationDecl(serEng.getMemoryManager());
+            data->serialize(serEng);
+            (*objToLoad)->put(data);
+        }
+   
+    }
+
+}
+
+XERCES_CPP_NAMESPACE_END
+
diff --git a/src/xercesc/internal/XTemplateSerializer.hpp b/src/xercesc/internal/XTemplateSerializer.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..37d60468d18954521ab29214587136ad0446354c
--- /dev/null
+++ b/src/xercesc/internal/XTemplateSerializer.hpp
@@ -0,0 +1,391 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written
+ *    permission, please contact apache\@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+/*
+ * $Log$
+ * Revision 1.1  2003/10/17 21:07:49  peiyongz
+ * To support Template object serialization/deserialization
+ *
+ * $Id$
+ *
+ */
+
+#if !defined(XTEMPLATE_SERIALIZER_HPP)
+#define XTEMPLATE_SERIALIZER_HPP
+
+#include <xercesc/util/ValueVectorOf.hpp>
+#include <xercesc/util/RefArrayVectorOf.hpp>
+#include <xercesc/util/RefVectorOf.hpp>
+#include <xercesc/util/RefHashTableOf.hpp>
+#include <xercesc/util/RefHash2KeysTableOf.hpp>
+#include <xercesc/util/RefHash3KeysIdPool.hpp>
+#include <xercesc/util/NameIdPool.hpp>
+
+#include <xercesc/framework/XMLNotationDecl.hpp>
+#include <xercesc/framework/XMLRefInfo.hpp>
+#include <xercesc/util/XMLNumber.hpp>
+#include <xercesc/validators/common/ContentSpecNode.hpp>
+#include <xercesc/validators/DTD/DTDAttDef.hpp>
+#include <xercesc/validators/DTD/DTDElementDecl.hpp>
+#include <xercesc/validators/DTD/DTDEntityDecl.hpp>
+#include <xercesc/validators/schema/SchemaAttDef.hpp>
+#include <xercesc/validators/schema/SchemaElementDecl.hpp>
+#include <xercesc/validators/schema/XercesGroupInfo.hpp>
+#include <xercesc/validators/schema/XercesAttGroupInfo.hpp>
+#include <xercesc/validators/schema/SchemaGrammar.hpp>
+#include <xercesc/validators/schema/identity/IC_Field.hpp>
+#include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
+#include <xercesc/validators/schema/identity/XercesXPath.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+class XMLUTIL_EXPORT XTemplateSerializer
+{
+public:
+
+    /**********************************************************
+     *
+     * ValueVectorOf
+     *
+     *   SchemaElementDecl*
+     *   unsigned int
+     *
+     ***********************************************************/   
+    static void           storeObject(ValueVectorOf<SchemaElementDecl*>* const tempObjToWrite
+                                    , XSerializeEngine&                        serEng);
+
+    static void           loadObject(ValueVectorOf<SchemaElementDecl*>**       tempObjToRead
+                                   , int                                       initSize
+                                   , bool                                      toCallDestructor
+                                   , XSerializeEngine&                         serEng);
+
+    static void           storeObject(ValueVectorOf<unsigned int>* const tempObjToWrite
+                                    , XSerializeEngine&                  serEng);
+
+    static void           loadObject(ValueVectorOf<unsigned int>**       tempObjToRead
+                                   , int                                 initSize
+                                   , bool                                toCallDestructor
+                                   , XSerializeEngine&                   serEng);
+
+    /**********************************************************
+     *
+     * RefArrayVectorOf
+     *
+     *   XMLCh
+     *
+     ***********************************************************/   
+    static void           storeObject(RefArrayVectorOf<XMLCh>* const tempObjToWrite
+                                    , XSerializeEngine&              serEng);
+
+    static void           loadObject(RefArrayVectorOf<XMLCh>**       tempObjToRead
+                                   , int                             initSize
+                                   , bool                            toAdopt
+                                   , XSerializeEngine&               serEng);
+
+    /**********************************************************
+     *
+     * RefVectorOf
+     *
+     *   SchemaAttDef
+     *   SchemaElementDecl
+     *   ContentSpecNode
+     *   IC_Field
+     *   DatatypeValidator
+     *   IdentityConstraint
+     *   XMLNumber
+     *   XercesLocationPath
+     *   XercesStep
+     *
+     ***********************************************************/
+    static void           storeObject(RefVectorOf<SchemaAttDef>* const tempObjToWrite
+                                    , XSerializeEngine&                serEng);
+
+    static void           loadObject(RefVectorOf<SchemaAttDef>**       tempObjToRead
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng);
+
+    static void           storeObject(RefVectorOf<SchemaElementDecl>* const tempObjToWrite
+                                    , XSerializeEngine&                     serEng);
+
+    static void           loadObject(RefVectorOf<SchemaElementDecl>**       tempObjToRead
+                                   , int                                    initSize
+                                   , bool                                   toAdopt
+                                   , XSerializeEngine&                      serEng);
+
+    static void           storeObject(RefVectorOf<ContentSpecNode>* const tempObjToWrite
+                                    , XSerializeEngine&                   serEng);
+
+    static void           loadObject(RefVectorOf<ContentSpecNode>**       tempObjToRead
+                                   , int                                  initSize
+                                   , bool                                 toAdopt
+                                   , XSerializeEngine&                    serEng);
+
+    static void           storeObject(RefVectorOf<IC_Field>* const tempObjToWrite
+                                    , XSerializeEngine&            serEng);
+
+    static void           loadObject(RefVectorOf<IC_Field>**       tempObjToRead
+                                   , int                           initSize
+                                   , bool                          toAdopt
+                                   , XSerializeEngine&             serEng);
+
+    static void           storeObject(RefVectorOf<DatatypeValidator>* const tempObjToWrite
+                                    , XSerializeEngine&                     serEng);
+
+    static void           loadObject(RefVectorOf<DatatypeValidator>**       tempObjToRead
+                                   , int                                    initSize
+                                   , bool                                   toAdopt
+                                   , XSerializeEngine&                      serEng);
+ 
+    static void           storeObject(RefVectorOf<IdentityConstraint>* const tempObjToWrite
+                                    , XSerializeEngine&                      serEng);
+
+    static void           loadObject(RefVectorOf<IdentityConstraint>**       tempObjToRead
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng);
+
+    static void           storeObject(RefVectorOf<XMLNumber>* const tempObjToWrite
+                                    , XSerializeEngine&             serEng);
+
+    static void           loadObject(RefVectorOf<XMLNumber>**       tempObjToRead
+                                   , int                            initSize
+                                   , bool                           toAdopt
+                                   , XMLNumber::NumberType          numType
+                                   , XSerializeEngine&              serEng);
+
+    static void           storeObject(RefVectorOf<XercesLocationPath>* const tempObjToWrite
+                                    , XSerializeEngine&                      serEng);
+
+    static void           loadObject(RefVectorOf<XercesLocationPath>**       tempObjToRead
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng);
+
+    static void           storeObject(RefVectorOf<XercesStep>* const tempObjToWrite
+                                    , XSerializeEngine&              serEng);
+
+    static void           loadObject(RefVectorOf<XercesStep>**       tempObjToRead
+                                   , int                             initSize
+                                   , bool                            toAdopt
+                                   , XSerializeEngine&               serEng);
+
+    /**********************************************************
+     *
+     * RefHashTableOf
+     *
+     *   KVStringPair
+     *   XMLAttDef
+     *   DTDAttDef
+     *   ComplexTypeInfo
+     *   XercesGroupInfo
+     *   XercesAttGroupInfo
+     *   XMLRefInfo
+     *   DatatypeValidator
+     *
+     ***********************************************************/
+    static void           storeObject(RefHashTableOf<KVStringPair>* const tempObjToWrite
+                                    , XSerializeEngine&                   serEng);
+
+    static void           loadObject(RefHashTableOf<KVStringPair>**       tempObjToRead
+                                   , int                                  initSize
+                                   , bool                                 toAdopt
+                                   , XSerializeEngine&                    serEng);
+
+    static void           storeObject(RefHashTableOf<XMLAttDef>* const tempObjToWrite
+                                    , XSerializeEngine&                serEng);
+
+    static void           loadObject(RefHashTableOf<XMLAttDef>**       tempObjToRead
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng);
+
+    static void           storeObject(RefHashTableOf<DTDAttDef>* const tempObjToWrite
+                                    , XSerializeEngine&                serEng);
+
+    static void           loadObject(RefHashTableOf<DTDAttDef>**       tempObjToRead
+                                   , int                               initSize
+                                   , bool                              toAdopt
+                                   , XSerializeEngine&                 serEng);
+
+    static void           storeObject(RefHashTableOf<ComplexTypeInfo>* const tempObjToWrite
+                                    , XSerializeEngine&                      serEng);
+
+    static void           loadObject(RefHashTableOf<ComplexTypeInfo>**       tempObjToRead
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng);
+
+    static void           storeObject(RefHashTableOf<XercesGroupInfo>* const tempObjToWrite
+                                    , XSerializeEngine&                      serEng);
+
+    static void           loadObject(RefHashTableOf<XercesGroupInfo>**       tempObjToRead
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng);
+
+    static void           storeObject(RefHashTableOf<XercesAttGroupInfo>* const tempObjToWrite
+                                    , XSerializeEngine&                         serEng);
+
+    static void           loadObject(RefHashTableOf<XercesAttGroupInfo>**       tempObjToRead
+                                   , int                                        initSize
+                                   , bool                                       toAdopt
+                                   , XSerializeEngine&                          serEng);
+
+    static void           storeObject(RefHashTableOf<XMLRefInfo>* const tempObjToWrite
+                                    , XSerializeEngine&                 serEng);
+
+    static void           loadObject(RefHashTableOf<XMLRefInfo>**       tempObjToRead
+                                   , int                                initSize
+                                   , bool                               toAdopt
+                                   , XSerializeEngine&                  serEng);
+
+    static void           storeObject(RefHashTableOf<DatatypeValidator>* const tempObjToWrite
+                                    , XSerializeEngine&                        serEng);
+
+    static void           loadObject(RefHashTableOf<DatatypeValidator>**       tempObjToRead
+                                   , int                                       initSize
+                                   , bool                                      toAdopt
+                                   , XSerializeEngine&                         serEng);
+
+
+    /**********************************************************
+     *
+     * RefHash2KeysTableOf
+     *
+     *   SchemaAttDef
+     *   ElemVector
+     *
+     ***********************************************************/
+    static void           storeObject(RefHash2KeysTableOf<SchemaAttDef>* const tempObjToWrite
+                                    , XSerializeEngine&                        serEng);
+
+    static void           loadObject(RefHash2KeysTableOf<SchemaAttDef>**       tempObjToRead
+                                   , int                                       initSize
+                                   , bool                                      toAdopt
+                                   , XSerializeEngine&                         serEng);
+
+    static void           storeObject(RefHash2KeysTableOf<ElemVector>* const tempObjToWrite
+                                    , XSerializeEngine&                      serEng);
+
+    static void           loadObject(RefHash2KeysTableOf<ElemVector>**       tempObjToRead
+                                   , int                                     initSize
+                                   , bool                                    toAdopt
+                                   , XSerializeEngine&                       serEng);
+
+    /**********************************************************
+     *
+     * RefHash3KeysIdPool
+     *
+     *   SchemaElementDecl
+     *
+     ***********************************************************/
+    static void           storeObject(RefHash3KeysIdPool<SchemaElementDecl>* const tempObjToWrite
+                                    , XSerializeEngine&                            serEng);
+
+    static void           loadObject(RefHash3KeysIdPool<SchemaElementDecl>**       tempObjToRead
+                                   , int                                           initSize
+                                   , bool                                          toAdopt
+                                   , int                                           initSize2
+                                   , XSerializeEngine&                             serEng);
+
+    /**********************************************************
+     *
+     * NameIdPool
+     *
+     *   DTDElementDecl
+     *   DTDEntityDecl
+     *   XMLNotationDecl
+     *
+     ***********************************************************/
+    static void           storeObject(NameIdPool<DTDElementDecl>* const tempObjToWrite
+                                    , XSerializeEngine&                 serEng);
+
+    static void           loadObject(NameIdPool<DTDElementDecl>**       tempObjToRead
+                                   , int                                initSize
+                                   , int                                initSize2
+                                   , XSerializeEngine&                  serEng);
+
+    static void           storeObject(NameIdPool<DTDEntityDecl>* const tempObjToWrite
+                                    , XSerializeEngine&                serEng);
+
+    static void           loadObject(NameIdPool<DTDEntityDecl>**       tempObjToRead
+                                   , int                               initSize
+                                   , int                               initSize2
+                                   , XSerializeEngine&                 serEng);
+
+    static void           storeObject(NameIdPool<XMLNotationDecl>* const tempObjToWrite
+                                    , XSerializeEngine&                  serEng);
+
+    static void           loadObject(NameIdPool<XMLNotationDecl>**      tempObjToRead
+                                   , int                                initSize
+                                   , int                                initSize2
+                                   , XSerializeEngine&                  serEng);
+
+private:
+    // -----------------------------------------------------------------------
+    //  Unimplemented constructors and operators
+    // -----------------------------------------------------------------------
+	~XTemplateSerializer();
+    XTemplateSerializer();
+    XTemplateSerializer(const XTemplateSerializer&);
+	XTemplateSerializer& operator=(const XTemplateSerializer&);
+
+};
+
+XERCES_CPP_NAMESPACE_END
+
+#endif