diff --git a/samples/SimpleXPathAPI/SimpleXPathAPI.cpp b/samples/SimpleXPathAPI/SimpleXPathAPI.cpp
index 6dbe88d..c2c6f0a 100644
--- a/samples/SimpleXPathAPI/SimpleXPathAPI.cpp
+++ b/samples/SimpleXPathAPI/SimpleXPathAPI.cpp
@@ -19,7 +19,8 @@
 
 
 
-#include <DOMSupport/XalanDocumentPrefixResolver.hpp>
+#include <XalanDOM/XalanDocument.hpp>
+#include <XalanDOM/XalanElement.hpp>
 
 
 
@@ -34,6 +35,44 @@
 
 
 
+XALAN_USING_XALAN(XalanNode)
+XALAN_USING_XALAN(XalanElement)
+
+
+
+const XalanElement*
+getPrefixResolver(const XalanNode*	node)
+{
+	if (node == 0)
+	{
+		return 0;
+	}
+	else if (node->getNodeType() == XalanNode::ELEMENT_NODE)
+	{
+#if defined(XALAN_OLD_STYLE_CASTS)
+		return (const XalanElement*)node;
+#else
+		return static_cast<const XalanElement*>(node);
+#endif
+	}
+	else if (node->getNodeType() == XalanNode::DOCUMENT_NODE)
+	{
+		XALAN_USING_XALAN(XalanDocument)
+
+#if defined(XALAN_OLD_STYLE_CASTS)
+		return ((const XalanDocument*)node)->getDocumentElement();
+#else
+		return static_cast<const XalanDocument*>(node)->getDocumentElement();
+#endif
+	}
+	else
+	{
+		return getPrefixResolver(node->getParentNode());
+	}
+}
+
+
+
 int
 main(
 			int				argc,
@@ -68,7 +107,6 @@
 				XALAN_USING_XERCES(LocalFileInputSource)
 
 				XALAN_USING_XALAN(XalanDocument)
-				XALAN_USING_XALAN(XalanDocumentPrefixResolver)
 				XALAN_USING_XALAN(XalanDOMString)
 				XALAN_USING_XALAN(XalanNode)
 				XALAN_USING_XALAN(XalanSourceTreeInit)
@@ -96,8 +134,6 @@
 						theLiaison.parseXMLStream(theInputSource);
 				assert(theDocument != 0);
 
-				XalanDocumentPrefixResolver		thePrefixResolver(theDocument);
-
 				XPathEvaluator	theEvaluator;
 
 				// OK, let's find the context node...
@@ -106,7 +142,7 @@
 							theDOMSupport,
 							theDocument,
 							XalanDOMString(argv[2]).c_str(),
-							thePrefixResolver);
+							theDocument->getDocumentElement());
 
 				if (theContextNode == 0)
 				{
@@ -126,7 +162,7 @@
 								theDOMSupport,
 								theContextNode,
 								XalanDOMString(argv[3]).c_str(),
-								thePrefixResolver));
+								getPrefixResolver(theContextNode)));
 
 					assert(theResult.null() == false);
 
diff --git a/samples/SimpleXPathAPI/foo.xml b/samples/SimpleXPathAPI/foo.xml
index 04a6c89..14f51a8 100644
--- a/samples/SimpleXPathAPI/foo.xml
+++ b/samples/SimpleXPathAPI/foo.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
-<foo:doc xmlns:foo="http://www.foo.com">
-  <foo:name first="David" last="Marston">Mr. Marston</foo:name>
-  <foo:name first="David" last="Bertoni">Mr. Bertoni</foo:name>
-  <foo:name first="Donald" last="Leslie">Mr. Leslie</foo:name>
-  <foo:name first="Emily" last="Farmer">Ms. Farmer</foo:name>
-  <foo:name first="Myriam" last="Midy">Ms. Midy</foo:name>
-  <foo:name first="Paul" last="Dick">Mr. Dick</foo:name>
-  <foo:name first="Scott" last="Boag">Mr. Boag</foo:name>
-  <foo:name first="Shane" last="Curcuru">Mr. Curcuru</foo:name>
-  <foo:name first="Joseph" last="Kesselman">Mr. Kesselman</foo:name>
-  <foo:name first="Stephen" last="Auriemma">Mr. Auriemma</foo:name>
-</foo:doc>
+<doc>
+  <name first="David" last="Marston">Mr. Marston</name>
+  <name first="David" last="Bertoni">Mr. Bertoni</name>
+  <name first="Donald" last="Leslie">Mr. Leslie</name>
+  <name first="Emily" last="Farmer">Ms. Farmer</name>
+  <name first="Myriam" last="Midy">Ms. Midy</name>
+  <name first="Paul" last="Dick">Mr. Dick</name>
+  <name first="Scott" last="Boag">Mr. Boag</name>
+  <name first="Shane" last="Curcuru">Mr. Curcuru</name>
+  <name first="Joseph" last="Kesselman">Mr. Kesselman</name>
+  <name first="Stephen" last="Auriemma">Mr. Auriemma</name>
+</doc>
\ No newline at end of file
diff --git a/src/DOMSupport/XalanDocumentPrefixResolver.cpp b/src/DOMSupport/XalanDocumentPrefixResolver.cpp
deleted file mode 100644
index 839f92b..0000000
--- a/src/DOMSupport/XalanDocumentPrefixResolver.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999-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 "Xalan" 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/>.
- */
-// Class header file...
-#include "XalanDocumentPrefixResolver.hpp"
-
-
-
-#include <XalanDOM/XalanAttr.hpp>
-#include <XalanDOM/XalanElement.hpp>
-#include <XalanDOM/XalanNamedNodeMap.hpp>
-
-
-
-#include <DOMSupport/DOMServices.hpp>
-
-
-
-XALAN_CPP_NAMESPACE_BEGIN
-
-
-
-XalanDocumentPrefixResolver::XalanDocumentPrefixResolver(
-			const XalanDocument*	theDocument,
-			const XalanDOMString&	theURI) :
-	m_namespaces(),
-	m_uri(theURI)
-{
-	assert(theDocument != 0);
-
-	NamespaceNodesTreeWalker	theWalker(m_namespaces);
-
-	theWalker.traverse(theDocument);
-}
-
-
-
-XalanDocumentPrefixResolver::~XalanDocumentPrefixResolver()
-{
-}
-
-
-
-const XalanDOMString*
-XalanDocumentPrefixResolver::getNamespaceForPrefix(const XalanDOMString&	prefix) const
-{
-	const NamespacesMapType::const_iterator		i = m_namespaces.find(&prefix);
-
-	if (i == m_namespaces.end())
-	{
-		return 0;
-	}
-	else
-	{
-		const AttributeVectorType&	theVector = (*i).second;
-		assert(theVector.size() > 0);
-
-		if (theVector.size() == 1)
-		{
-			assert(theVector.front() != 0);
-
-			return &(theVector.front()->getNodeValue());
-		}
-		else
-		{
-			return duplicateBinding(theVector);
-		}
-	}
-}
-
-
-
-const XalanDOMString&
-XalanDocumentPrefixResolver::getURI() const
-{
-	return m_uri;
-}
-
-
-
-const XalanDOMString*
-XalanDocumentPrefixResolver::duplicateBinding(const AttributeVectorType&	theVector) const
-{
-	assert(theVector.front() != 0);
-
-	return &(theVector.front()->getNodeValue());
-}
-
-
-
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::NamespaceNodesTreeWalker(NamespacesMapType& 	theMap) :
-	TreeWalker(),
-	m_map(theMap)
-{
-}
-
-
-
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::~NamespaceNodesTreeWalker()
-{
-}
-
-
-
-bool
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::startNode(const XalanNode*	node)
-{
-	assert(node != 0);
-
-	switch(node->getNodeType())
-	{
-	case XalanNode::ELEMENT_NODE:
-		{
-			const XalanElement*	theElementNode =
-#if defined(XALAN_OLD_STYLE_CASTS)
-				(const XalanElement*)node;
-#else
-				static_cast<const XalanElement*>(node);
-#endif
-
-			const XalanNamedNodeMap* const	atts = theElementNode->getAttributes();
-			assert(atts != 0);
-
-			const unsigned int	theSize = atts->getLength();
-
-			for (unsigned int i = 0; i < theSize; ++i)
-			{
-				assert(atts->item(i) != 0 && atts->item(i)->getNodeType() == XalanNode::ATTRIBUTE_NODE);
-
-				const XalanAttr* const	theAttr =
-#if defined(XALAN_OLD_STYLE_CASTS)
-					(const XalanAttr*)atts->item(i);
-#else
-					static_cast<const XalanAttr*>(atts->item(i));
-#endif
-
-				if (DOMServices::isNamespaceDeclaration(*theAttr) == true)
-				{
-					m_map[&theAttr->getLocalName()].push_back(theAttr);
-				}
-			}
-		}
-		break;
-
-	default:
-		// Do nothing...
-		break;
-	}
-
-	return false;
-}
-
-
-
-bool
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::startNode(XalanNode*		node)
-{
-	assert(node != 0);
-
-#if defined(XALAN_OLD_STYLE_CASTS)
-	return startNode((const XalanNode*)node);
-#else
-	return startNode(const_cast<const XalanNode*>(node));
-#endif
-}
-
-
-
-bool
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::endNode(const XalanNode*		/* node */)
-{
-	return false;
-}
-
-
-
-bool
-XalanDocumentPrefixResolver::NamespaceNodesTreeWalker::endNode(XalanNode*	/* node */)
-{
-	return false;
-}
-
-
-
-XALAN_CPP_NAMESPACE_END
diff --git a/src/DOMSupport/XalanDocumentPrefixResolver.hpp b/src/DOMSupport/XalanDocumentPrefixResolver.hpp
deleted file mode 100644
index 82d9552..0000000
--- a/src/DOMSupport/XalanDocumentPrefixResolver.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999-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 "Xalan" 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/>.
- */
-#if !defined(XALANDOCUMENTPREFIXRESOLVER_HEADER_GUARD_1357924680)
-#define XALANDOCUMENTPREFIXRESOLVER_HEADER_GUARD_1357924680
-
-
-
-// Base include file.  Must be first.
-#include <DOMSupport/DOMSupportDefinitions.hpp>
-
-
-
-#include <map>
-#include <vector>
-
-
-
-#include <XalanDOM/XalanDOMString.hpp>
-
-
-
-#include <PlatformSupport/PrefixResolver.hpp>
-#include <PlatformSupport/DOMStringHelper.hpp>
-
-
-
-#include <Include/STLHelper.hpp>
-
-
-
-#include <DOMSupport/TreeWalker.hpp>
-
-
-
-XALAN_CPP_NAMESPACE_BEGIN
-
-
-
-class XalanAttr;
-class XalanDocument;
-
-
-
-class XALAN_DOMSUPPORT_EXPORT XalanDocumentPrefixResolver : public PrefixResolver
-{
-public:
-
-#if defined(XALAN_NO_STD_NAMESPACE)
-	typedef vector<const XalanNode*> 					AttributeVectorType;
-
-	typedef map<const XalanDOMString*,
-				AttributeVectorType,
-				pointer_less<XalanDOMString> >			NamespacesMapType;
-#else
-	typedef std::vector<const XalanNode*> 				AttributeVectorType;
-
-	typedef std::map<const XalanDOMString*,
-					 AttributeVectorType,
-					 pointer_less<XalanDOMString> >		NamespacesMapType;
-#endif
-
-	/**
-	 * Constructor.
-	 *
-	 * @param theDocument The XalanDocument instance to use for namespace bindings.
-	 * @param theURI The base URI for the instance.  This is rarely needed, but can be provided if the URI for the XalanDocument instance is known.
-	 */
-	XalanDocumentPrefixResolver(
-			const XalanDocument*	theDocument,
-			const XalanDOMString&	theURI = XalanDOMString());
-
-	virtual
-	~XalanDocumentPrefixResolver();
-
-
-	virtual const XalanDOMString*
-	getNamespaceForPrefix(const XalanDOMString&		prefix) const;
-
-	virtual const XalanDOMString&
-	getURI() const;
-
-	/**
-	 * A utility class to walk the XalanDocument instance and look for attribute nodes that declare namespaces.
-	 */
-	class NamespaceNodesTreeWalker : public TreeWalker
-	{
-	public:
-
-		NamespaceNodesTreeWalker(NamespacesMapType&		theMap);
-
-		virtual
-		~NamespaceNodesTreeWalker();
-
-	protected:
-
-		virtual bool
-		startNode(const XalanNode*	node);
-
-		virtual bool
-		startNode(XalanNode*	node);
-
-		virtual bool
-		endNode(const XalanNode*	node);
-
-		virtual bool
-		endNode(XalanNode*	node);
-
-	private:
-
-		NamespacesMapType&	m_map;
-	};
-
-
-protected:
-
-	/**
-	 * This function is called when more than one binding exists for a given prefix.
-	 * The default behavior uses the first binding, but a deriving class can change
-	 * that behavior by overriding.
-	 *
-	 * @param theVector The vector associated with the namespace prefix. 
-	 * @return A pointer to a const XalanDOMString containing the desired binding, or NULL.
-	 */
-	virtual const XalanDOMString*
-	duplicateBinding(const AttributeVectorType&		theVector) const;
-
-private:
-
-	NamespacesMapType		m_namespaces;
-
-	const XalanDOMString	m_uri;
-};
-
-
-
-XALAN_CPP_NAMESPACE_END
-
-
-
-#endif	// XALANDOCUMENTPREFIXRESOLVER_HEADER_GUARD_1357924680
diff --git a/src/PlatformSupport/AttributeListImpl.cpp b/src/PlatformSupport/AttributeListImpl.cpp
index 7b53dff..b87112b 100644
--- a/src/PlatformSupport/AttributeListImpl.cpp
+++ b/src/PlatformSupport/AttributeListImpl.cpp
@@ -408,9 +408,12 @@
 
 		const XMLCh* const	theNewValueEnd = AttributeVectorEntry::endArray(value) + 1;
 
+		const XMLChVectorType::size_type	theNewSize =
+						XMLChVectorType::size_type(theNewValueEnd - value);
+
 		// If necessary, create the a new vector and swap them.  Otherwise,
 		// just copy the new data in.
-		if ((*i)->m_Value.capacity() < XMLChVectorType::size_type(theNewValueEnd - value))
+		if ((*i)->m_Value.capacity() < theNewSize)
 		{
 			XMLChVectorType		theNewValue(value, theNewValueEnd);
 
@@ -418,6 +421,8 @@
 		}
 		else
 		{
+			(*i)->m_Value.resize(theNewSize);
+
 			copy(value, theNewValueEnd, (*i)->m_Value.begin());
 		}
 	}
diff --git a/src/PlatformSupport/DOMStringHelper.cpp b/src/PlatformSupport/DOMStringHelper.cpp
index 690828a..bc801db 100644
--- a/src/PlatformSupport/DOMStringHelper.cpp
+++ b/src/PlatformSupport/DOMStringHelper.cpp
@@ -1328,7 +1328,7 @@
 				theInputEnd,
 				theOutputIterator,
 #if defined(XALAN_NON_ASCII_PLATFORM)
-				DecimalNumberTranscodeTransform<char, XalanDOMChar>());
+				HexadecimalNumberTranscodeTransform<char, XalanDOMChar>());
 #else
 				IdentityTransform<char, XalanDOMChar>());
 #endif
diff --git a/src/XPath/FunctionDoc.hpp b/src/XPath/FunctionDoc.hpp
deleted file mode 100644
index 6e72d3d..0000000
--- a/src/XPath/FunctionDoc.hpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 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 "Xalan" 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/>.
- */
-#if !defined(FUNCTIONDOC_HEADER_GUARD_1357924680)
-#define FUNCTIONDOC_HEADER_GUARD_1357924680
-
-
-
-// Base header file.  Must be first.
-#include <XSLT/XSLTDefinitions.hpp>
-
-
-
-#include <vector>
-
-
-
-#include <PlatformSupport/DOMStringHelper.hpp>
-
-
-
-// Base class header file...
-#include <XPath/Function.hpp>
-
-
-/**
- * XPath implementation of "document" function.
- */
-//
-// These are all inline, even though
-// there are virtual functions, because we expect that they will only be
-// needed by the XSLT class.
-class XALAN_XSLT_EXPORT FunctionDoc : public Function
-{
-public:
-
-	// These methods are inherited from Function ...
-
-	virtual XObjectPtr
-	execute(
-			XPathExecutionContext&			executionContext,
-			const DOM_Node&					context,
-			int								/* opPos */,
-			const XObjectArgVectorType&		args)
-	{
-		executionContext.error("Document() function implementation has been replaced by xslt/FunctionDocument!",
-							   context);
-
-		return executionContext.getXObjectFactory().createNull();
-	}
-
-#if defined(XALAN_NO_COVARIANT_RETURN_TYPE)
-	virtual Function*
-#else
-	virtual FunctionDoc*
-#endif
-	clone() const
-	{
-		return new FunctionDoc(*this);
-	}
-
-private:
-
-	// Not implemented...
-	FunctionDoc&
-	operator=(const FunctionDoc&);
-
-	bool
-	operator==(const FunctionDoc&) const;
-};
-
-
-
-#endif	// FUNCTIONDOC_HEADER_GUARD_1357924680
diff --git a/src/XPath/MutableNodeRefList.cpp b/src/XPath/MutableNodeRefList.cpp
index d721be7..19b74e5 100644
--- a/src/XPath/MutableNodeRefList.cpp
+++ b/src/XPath/MutableNodeRefList.cpp
@@ -420,7 +420,14 @@
 
 			if (theIndex < theCurrentIndex)
 			{
-				last = current - 1;
+				if (current == begin)
+				{
+					break;
+				}
+				else
+				{
+					last = current - 1;
+				}
 			}
 			else if (theIndex > theCurrentIndex)
 			{
diff --git a/src/XPath/XObject.cpp b/src/XPath/XObject.cpp
index c69b2de..4fc80ec 100644
--- a/src/XPath/XObject.cpp
+++ b/src/XPath/XObject.cpp
@@ -682,7 +682,7 @@
 			const double			theRHS,
 			const CompareFunction&	theCompareFunction)
 {
-	bool				theResult = false;
+	bool	theResult = false;
 
 	const NodeRefListBase::size_type	len1 = theLHSNodeSet.getLength();
 
diff --git a/src/XSLT/NamespacesHandler.hpp b/src/XSLT/NamespacesHandler.hpp
index e6979a0..3e63389 100644
--- a/src/XSLT/NamespacesHandler.hpp
+++ b/src/XSLT/NamespacesHandler.hpp
@@ -109,7 +109,7 @@
 		isActive(const XalanDOMString&	thePrefix) const = 0;
 	};
 
-	class Namespace
+	class XALAN_XSLT_EXPORT Namespace
 	{
 	public:
 
@@ -186,7 +186,7 @@
 		const XalanDOMString*	m_uri;
 	};
 
-	class NamespaceExtended : public Namespace
+	class XALAN_XSLT_EXPORT NamespaceExtended : public Namespace
 	{
 	public:
 
diff --git a/src/XSLT/XalanTemplate.cpp b/src/XSLT/XalanTemplate.cpp
index aed91a6..cfcd9eb 100644
--- a/src/XSLT/XalanTemplate.cpp
+++ b/src/XSLT/XalanTemplate.cpp
@@ -104,11 +104,7 @@
 #include <PlatformSupport/PrintWriter.hpp>
 #include <PlatformSupport/XalanOutputStream.hpp>
 #include <PlatformSupport/XalanUnicode.hpp>
-#include <PlatformSupport/XalanDOMStringCache.hpp>
-
-
-
-#include <DOMSupport/XalanDocumentPrefixResolver.hpp>
+#include <PlatformSupport/XalanDOMStringCache.hpp>	
 
 
 
