- Added KindTest interface that allows in particular the representation of element and attribute tests
- Added a "leaver" which is similar to a visitor but send callback after all children of a node were sent
- javadoc...

diff --git a/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java b/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
index 4b40278..01b8496 100644
--- a/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
+++ b/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
@@ -152,5 +152,15 @@
 		}
 		return result;
 	}
+	
+	/**
+	 * Returns true whenever the specified expression is a
+	 * <em>singleton sequence</em> (a sequence with only one item).
+	 */
+	public static boolean isSingletonSequence(Expr e)
+	{
+		return e != null && e.getExprType() == Expr.SEQUENCE_EXPR
+		&& ((OperatorExpr) e).getOperandCount() == 1;
+	}
 
 }
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
index 008a437..967b61f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
@@ -58,9 +58,9 @@
 import org.apache.xpath.datamodel.SequenceType;
 
 /**
- * Represents "cast as" and 'treat as' expression.
- * Use the method <code>getExprType()</code> to differentiate treat as and cast as 
- * expressions.
+ * Represents <em>cast as</em> and <em>treat as</em> expression.
+ * Use the method {@link #getExprType()} to differentiate 
+ * <em>treat as</em> from <em>cast as</em> expressions.
  * @see <a href="http://www.w3.org/TR/xpath20/#id-cast">
  * XPath 2.0 specification</a>
  */
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
index 88c5e1c..2b17b62 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
@@ -58,7 +58,7 @@
 import org.apache.xpath.datamodel.SequenceType;
 
 /**
- * Represent "castable as" expression.
+ * Represent <em>castable as</em> expressions.
  * @see <a href="http://www.w3.org/TR/xpath20/#id-castable">
  * XPath 2.0 specification</a>
  */
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java b/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
index 1aaf9c3..ab6dedb 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
@@ -57,8 +57,8 @@
 
 /**
  * Represents a XPath expression.
- * <p>Use {@link #getExprType()} to query the expression type. 
- * More information about expression are obtained by casting it
+ * <p>Use {@link #getExprType()} to get the expression type. 
+ * Then, more information about expression are obtained by casting it
  * to its corresponding java type. Here the XPath expression type to Java type mapping table:
  * </p>
  * <table cellpadding="2" cellspacing="2" border="1">
@@ -161,7 +161,7 @@
  * 			}
  * 		} else 
  * 		{
- * 		  System.out.println(e.getString(true) + " ");
+ * 		  System.out.print(e.getString(true) + " ");
  * 		}
  * }
  * </pre> 
@@ -171,12 +171,13 @@
  * </pre> 
  * <p>XPath expressions are always fully expanded. For example, the expression
  * /a//b is expanded to fn:root(self::node())/descendant-or-self::node()/b.
- * The number of steps is 3 (and not 2). 
+ * The number of steps is then 3 (and not 2). 
  * </p> 
  * <p>
- * An {@link Expr} object may be not a valid XPath expression but only a fragment.
- * For example a {@link StepExpr} expression is a fragment but can't be executed by
- * itself. To be valid, the top level expression must be an expression sequence.
+ * An {@link Expr} object may be not a valid XPath expression but only a fragment (or a part).
+ * For example {@link StepExpr} and {@link NodeTest} expression types are fragments 
+ * and therefore can't be executed by themself. To be valid, the top level expression 
+ * must be an expression sequence.
  * </p>
  * @see <a href="http://www.w3.org/TR/2002/WD-xpath20-20020816/#id-expressions">XPath 2.0 Specification</a>
  * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
@@ -214,7 +215,7 @@
 	/**
 	 * The expression is a quantified expression of type some     
 	 */
-	static final short SOME_EXPR = 22;
+	static final short SOME_EXPR = 8;
 
 	/**
 	 * The expression is a comparison expression type. 
@@ -254,11 +255,7 @@
 	 */
 	static final short VARIABLE_REF_EXPR = 15;
 
-	/**
-	 * The expression is a step
-	 */
-	static final short STEP = 17;
-
+	
 	/**
 	 * The expression is an instance of expression
 	 */
@@ -284,6 +281,17 @@
 	 */
 	static final short LET_EXPR = 23;
 
+	// Expression parts
+
+	/**
+	 * The expression part is a step
+	 */
+	static final short STEP = 17;
+
+	/**
+	 * The expression part is a node test
+	 */
+	static final short NODE_TEST = 11;
 
 	/**
 	 * Gets the expression type. 
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java
new file mode 100644
index 0000000..ca01349
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java
@@ -0,0 +1,147 @@
+/*
+ * Created on Aug 8, 2003
+ */
+package org.apache.xpath.expression;
+
+import org.apache.xml.QName;
+import org.apache.xpath.XPath20Exception;
+
+/**
+ * Represents <em>KindTest</em>.
+ * <p>The method {@link #getKindTestType()} returns the kind
+ * test type as following:
+ * <ul>
+ * <li><b>{@link #TEXT_TEST}</b> for text()</li>
+ * <li><b>{@link #PROCESSING_INSTRUCTION_TEST}</b> for processing-instruction()</b>. 
+ * Use {@link #getPITarget()} to get the target when specified.</li>
+ * <li><b>{@link #COMMENT_TEST}</b> for comment()</li>
+ * <li><b>{@link #ANY_KIND_TEST}</b> for node()</li>
+ * <li><b>{@link #CONTEXT_ITEM_TEST}</b> for '.'</li>
+ * <li><b>{@link #ELEMENT_TEST}</b> for element tests. Use {@link #getKindTestSubtype()} to get which one:
+ * <ul>
+ * <li><b>{@link #WILDCARD}</b> for element(), or element(*), or element(*,*)</b>
+ * <li><b>{@link #NODE_TYPE}</b> for element(N, T)</li>
+ * <li><b>{@link #NODE_TYPE_NILLABLE}</b> for element(N, T nillable)</li> 
+ * <li><b>{@link #NODE_WILDCARD}</b> for element(N, *)</li>
+ * <li><b>{@link #WILDCARD_TYPE}</b> for element(*, T)</li>
+ * <li><b>{@link #SCHEMA_PATH}</b> for element(P)</li>
+ * </ul> 
+ * </li>
+ * <li><b>{@link #ATTRIBUTE_TEST}</b> for attribute test.  Use {@link #getKindTestSubtype()} to get which one:
+ * <ul>
+ * <li><b>{@link #WILDCARD}</b> for attribute(), or attribute(*), or attribute(*,*)</b>
+ * <li><b>{@link #NODE_TYPE}</b> for attribute(@N, T)</li>
+ * <li><b>{@link #NODE}</b> for attribute(@N)</li>
+ * <li><b>{@link #NODE_WILDCARD}</b> for attribute(@N, *)</li>
+ * <li><b>{@link #WILDCARD_TYPE}</b> for attribute(@*, T)</li>
+ * <li><b>{@link #SCHEMA_PATH}</b> for attribute(P)</li>
+ * </ul>
+ * </ul> 
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface KindTest extends NodeTest
+{
+	
+	/**
+	 * Processing instruction test (kind test) 
+	 */
+	static final short PROCESSING_INSTRUCTION_TEST = 0;
+	
+	/**
+	 * Comment test (kind test)
+	 */
+	static final short COMMENT_TEST = 1;
+	
+	/**	 
+	 * Any kind test (except context item test)
+	 */
+	static final short ANY_KIND_TEST = 2;
+	
+	/**
+	 * Text test (kind test)
+	 */
+	static final short TEXT_TEST = 3;
+	
+	/**
+	 * Document test (kind test)
+	 */
+	static final short DOCUMENT_TEST = 4;
+	
+	/**
+	 * Element test (kind test)
+	 */
+	static final short ELEMENT_TEST = 5;
+
+	/**
+	 * Attribute test (kind test)
+	 */
+	static final short ATTRIBUTE_TEST = 6;    
+	
+	/**
+	 * The node test is a context item test (belong to the kind test group)
+	 */
+	static final short CONTEXT_ITEM_TEST = 7;
+
+	// Subtypes
+
+	static final short WILDCARD = 0;
+	static final short NODE_TYPE = 1;
+	static final short NODE = 6;
+	static final short NODE_TYPE_NILLABLE = 2;
+	static final short NODE_WILDCARD = 3;
+	static final short WILDCARD_TYPE = 4;
+	static final short SCHEMA_PATH = 5;
+	
+	/**
+	 * Gets the kind test code.
+	 * @return short One of the kind test constant value
+	 */
+	short getKindTestType(); 
+
+	/**
+	 * Gets the subtype kind test code.
+	 * @return short One of the subkind test constant value
+	 */
+	short getKindTestSubtype(); 
+
+	/**
+	 * Gets the local name used to match either an element,
+	 * an attribute or a document node. 
+	 * See class description to see when to use this method.
+	 * @return The local name or null
+	 * @throws XPath20Exception whenever the kind test type of is not
+	 * {@link #ELEMENT_TEST} or {@link #ATTRIBUTE_TEST}
+	 * or {@link #DOCUMENT_TEST}.
+	 */
+	QName getLocalName() throws XPath20Exception;
+	
+	/**
+	 * 
+	 * @return
+	 * @throws XPath20Exception
+	 */
+	QName getNodeName() throws XPath20Exception;
+	
+	/**
+	 * Gets type name. See class description to see when to use this method.
+	 * @return QName
+	 * @throws XPath20Exception
+	 */
+	QName getTypeName() throws XPath20Exception;
+	
+	/**
+	 * Gets schema context path. See class description to see when to use this method.
+	 * @return String (?)
+	 * @throws XPath20Exception
+	 */
+	String getSchemaContext() throws XPath20Exception;
+
+	/**
+	 * Gets the PITarget test or null if not specified.
+	 * @return
+	 * @throws XPath20Exception whenever the kind test is not
+	 * {@link #PROCESSING_INSTRUCTION_TEST}.
+	 */
+	String getPITarget() throws XPath20Exception;
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java b/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java
new file mode 100644
index 0000000..748894c
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java
@@ -0,0 +1,56 @@
+/*
+ * Created on Aug 11, 2003
+ */
+package org.apache.xpath.expression;
+
+/**
+ * Callbacks for receiving "leave" events. A "leave" event is sent
+ * for an given expression part when all its sub expression parts
+ * was visited. 
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface Leaver
+{
+	/**
+	 * Leave path expression
+	 * @param path
+	 */
+	void leavePath(PathExpr path);
+
+	/**
+	 * Leave step expression
+	 * @param     
+	 */
+	void leaveStep(StepExpr step);
+
+	/**
+	 * Leave operator expression
+	 * @param
+	 * 
+	 */
+	void leaveOperator(OperatorExpr operator);
+
+	/**
+	 * Leave conditional expression
+	 * @param
+	 */
+	void leaveConditional(ConditionalExpr condition);
+
+	/**
+	 * Leave for or quantified expression
+	 * @param
+	 */
+	void leaveForOrQuantifiedExpr(ForAndQuantifiedExpr expr);
+	
+	/**
+	 * Leave instance of expression
+	 */
+	void leaveInstanceOf(InstanceOfExpr expr);
+	
+	/**
+	 * Leave 'castable as' expression
+	 */
+	void leaveCastableAs(CastableAsExpr expr);
+
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java b/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
index 916a2bd..e6517da 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
@@ -62,18 +62,17 @@
 
 
 /**
- * Represents literal expression type.
- * <pre>
- * [59]   Literal   ::=   NumericLiteral |  StringLiteral 
- * [58]   NumericLiteral   ::=   IntegerLiteral |  DecimalLiteral |  DoubleLiteral 
- * [1]   IntegerLiteral   ::=   Digits 
- * [2]   DecimalLiteral   ::=   ("." Digits) |  (Digits "." [0-9]*) 
- * [3]   DoubleLiteral   ::=   (("." Digits) |  (Digits ("." [0-9]*)?)) ("e" | "E") ("+" | "-")? Digits 
- * [4]   StringLiteral ::=   ('"' (('"' '"') |  [^"])* '"') |  ("'" (("'" "'") |  [^'])* "'")
- * </pre>
- * 
- * @see <a href="http://www.w3.org/TR/xpath20#id-literals">XPath 2.0
- *      Specification</a>
+ * Represents <em>literal</em> expressions.
+ * Use {@link #getLiteralType()} to get the type of literal, as following
+ * <ul>
+ * <li>{@link #INTEGER_LITERAL}: xs:integer datatype</li>
+ * <li>{@link #DOUBLE_LITERAL}: xs:double datatype</li>
+ * <li>{@link #DECIMAL_LITERAL}: xs:decimal datatype</li>
+ * <li>{@link #STRING_LITERAL}: xs:string datatype</li>
+ * </ul>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ * @see <a href="http://www.w3.org/TR/xpath20#id-literals">XPath 2.0 Specification</a>
  */
 public interface Literal extends Expr
 {
@@ -99,64 +98,52 @@
 
     /**
      * Gets the literal type
-     *
      * @return short One of the four following literal type:
-     *         <code>INTEGER_LITERAL</code>, <code>DECIMAL_LITERAL</code>,
-     *         <code>STRING_LITERAL</code>, <code>DOUBLE_LITERAL</code>.
+     *         {@link #INTEGER_LITERAL}, {@link #DECIMAL_LITERAL},
+     *         {@link #STRING_LITERAL}, {@link #DOUBLE_LITERAL}.
      */
     short getLiteralType();
 
     /**
-     * Gets the integer literal
-     *
-     * @return DOCUMENT ME!
-     *
-     * @throws XPath20Exception when the literal isn't an integer or cannot be
-     *         represented by the primitive int type (in case of big integer)
+     * Gets the integer literal as primitive Java int type. 
+     * @return int
+     * @throws XPath20Exception when the literal isn't an integer or when it cannot be
+     *         represented as a primitive int type without approximations
      */
     int getIntegerLiteralAsInt() throws XPath20Exception;
 
     /**
-     * Gets the integer literal
-     *
-     * @return DOCUMENT ME!
-     *
+     * Gets the integer literal.
+     * @return BigInteger
      * @throws XPath20Exception when the literal isn't an integer
      */
     BigInteger getIntegerLiteral() throws XPath20Exception;
 
     /**
      * Gets the decimal literal
-     *
-     * @return DOCUMENT ME!
-     *
+     * @return BigDecimal
      * @throws XPath20Exception when the literal isn't a decimal
      */
     BigDecimal getDecimalLiteral() throws XPath20Exception;
 
     /**
      * Gets the decimal literal as a double
-     *
-     * @return DOCUMENT ME!
-     *
-     * @throws XPath20Exception when the literal isn't a decimal
+     * @return double
+     * @throws XPath20Exception when the literal isn't a decimal or
+     * when it cannot be represented as a double without approximations
      */
     double getDecimalLiteralAsDouble() throws XPath20Exception;
 
     /**
      * Gets the double literal
-     *
-     * @return DOCUMENT ME!
-     *
+     * @return double
      * @throws XPath20Exception when the literal isn't a double
      */
     double getDoubleLiteral() throws XPath20Exception;
 
     /**
      * Gets the string literal
-     *
-     * @return DOCUMENT ME!
-     *
+     * @return String
      * @throws XPath20Exception when the literal isn't a string
      */
     String getStringLiteral() throws XPath20Exception;
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java
new file mode 100644
index 0000000..aea06cf
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java
@@ -0,0 +1,50 @@
+/*
+ * Created on Aug 6, 2003
+ */
+package org.apache.xpath.expression;
+
+import org.apache.xml.QName;
+import org.apache.xpath.XPath20Exception;
+
+/**
+ * <em>NameTest</em> expression type.
+ * Dependings on the value returned by {@link #getNameTestType()},
+ * a name test have the following forms:
+ * <ul>
+ * <li>{@link #WILDCARD}: *</li>
+ * <li>{@link #NCNAME_WILDCARD}: ns:*</li>
+ * <li>{@link #WILDCARD_NCNAME}: *:ln</li>
+ * <li>{@link #QNAME}: (prefix?):localName</li>
+ * </ul> 
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface NameTest
+{
+	final short WILDCARD = 0;
+	final short NCNAME_WILDCARD = 1;
+	final short WILDCARD_NCNAME = 2;
+	final short QNAME = 3;
+
+	/**
+	 * Gets the name test type
+	 * @return One of the constants defined above
+	 */
+	short getNameTestType();
+
+	/**
+	 * Gets the qualified name of the name test.
+	 * @return Qualified name
+	 * @throws XPath20Exception when the name test type isn't
+	 * {@link #QNAME} 
+	 */
+	QName getName() throws XPath20Exception;
+	
+	/**
+	 * Gets the namespace or the local part of the name test.
+	 * @return NCName
+	 * @throws XPath20Exception when the name test type isn't
+	 * {@link #NCNAME_WILDCARD} or {@link #WILDCARD_NCNAME}
+	 */
+	String getNCName() throws XPath20Exception;
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
index 57f088c..4b96a95 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
@@ -55,12 +55,11 @@
  */
 package org.apache.xpath.expression;
 
-import org.apache.xml.QName;
 import org.apache.xpath.XPath20Exception;
 
 /**
- * Represents an item test. An item test includes both node tests 
- * and the context item test (dot).  
+ * Represents an <em>item test</em>. An item test includes both node tests 
+ * and the context item test (the character '.').  
  * <p>
  * A node test is either a name test or a kind test. For the former, use
  * the method {@link #getNameTest()} to get the {@link QName} involved in the test. 
@@ -79,38 +78,53 @@
  * @see <a href="http://www.w3.org/TR/xpath20/#doc-NodeTest">Node test specification</a>
  * @see <a href="http://www.w3.org/TR/xpath20/#abbrev">Context item specification</a>
  */
-public interface NodeTest {
+public interface NodeTest extends Expr {
     
     /**
-     * The item test is a processing instruction kind test 
+     * Processing instruction test (kind test) 
      */
 	static final short PROCESSING_INSTRUCTION_TEST = 0;
 	
 	/**
-	 * The item test is a comment kind test
+	 * Comment test (kind test)
 	 */
 	static final short COMMENT_TEST = 1;
 	
 	/**	 
-	 * The item test is any kind of test (except context item test)
+	 * Any kind test (except context item test)
 	 */
 	static final short ANY_KIND_TEST = 2;
 	
 	/**
-	 * The item test is a text kind test
+	 * Text test (kind test)
 	 */
 	static final short TEXT_TEST = 3;
 	
 	/**
+	 * Document test (kind test)
+	 */
+	static final short DOCUMENT_TEST = 4;
+	
+	/**
+	 * Element test (kind test)
+	 */
+	static final short ELEMENT_TEST = 5;
+
+	/**
+	 * Attribute test (kind test)
+	 */
+	static final short ATTRIBUTE_TEST = 6;    
+	
+	/**
 	 * The node test is a context item test (belong to the kind test group)
 	 */
-	static final short CONTEXT_ITEM_TEST = 4;
+	static final short CONTEXT_ITEM_TEST = 7;
     
     /**
-     * Full name of kind tests. 
+     * Full name of simple kind tests (whithout parameters). 
      * This array is synchronized with the kind test constants
      */
-	static final String[] KIND_TEST_NAME = { "processing-instruction()", "comment()", "node()", "text()", "." };
+	static final String[] KIND_TEST_NAME = { "processing-instruction()", "comment()", "node()", "text()", "document-node()", "element()", "attribute()", "." };
     
     /**
      * Return true whenever this node test is a name test
@@ -128,6 +142,7 @@
      * Gets the kind test code.
      * @return short One of the kind test constant value
      * @throws XPath20Exception whenever this node test isn't a kind test
+     * @deprecated cast to KindTest
      */
     short getKindTest() throws XPath20Exception; 
     
@@ -138,8 +153,9 @@
      * @return QName The name test
      * @throws XPath20Exception whenever this node test isn't a name test
      * or a pi kind test
+     * @deprecated cast to NameTest
      */
-    QName getNameTest() throws XPath20Exception;
+    NameTest getNameTest() throws XPath20Exception;
     
    
 }
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
index fde3d24..cec1030 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
@@ -56,8 +56,8 @@
 package org.apache.xpath.expression;
 
 /**
- * Represents <em>path</em> expression. <quote>It can be used to locate nodes within a tree.</quote>
- * <p>A path expression consists of a series of {@link StepExpr}. 
+ * Represents <em>path</em> expressions. <quote>It can be used to locate nodes within a tree.</quote>
+ * <p>A path expression consists of a sequence of {@link StepExpr}. 
  * It's a {@link OperatorExpr operator-based} expression
  * with {@link OperatorExpr#SLASH_STEP} as the operator separator 
  * and {@link Expr#PATH_EXPR} as the operator type. 
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
index 3b4243e..76567aa 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
@@ -57,189 +57,206 @@
 
 import org.apache.xpath.XPath20Exception;
 
-
 /**
- * Represents a step. 
- * <quote>A step generates a sequence of items and then filters the sequence 
- * by zero or more predicates.</quote>
+ * Represents <em>step</em> expressions. 
+ * A step is either a <em>axis step</em> or an <em>filter step</em>.
  * @see <a href="http://www.w3.org/TR/xpath20/#id-axis-steps">XPath 2.0
  *      specification</a>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
  */
 public interface StepExpr extends Expr
 {
-    /**
-     * Full name of axis. This array is kept in synchronization with axis
-     * constants.
-     */
-    static final String[] FULL_AXIS_NAME = 
-                                           {
-                                               "", "child", "descendant",
-                                               "parent", "attribute", "self",
-                                               "descendant-or-self", "ancestor",
-                                               "following-sibling",
-                                               "preceding-sibling", "following",
-                                               "preceding", "namespace",
-                                               "ancestor-or-self"
-                                           };
+	/**
+	 * Full name of axis. This array is kept in synchronization with axis
+	 * constants.
+	 */
+	static final String[] FULL_AXIS_NAME =
+		{
+			"",
+			"child",
+			"descendant",
+			"parent",
+			"attribute",
+			"self",
+			"descendant-or-self",
+			"ancestor",
+			"following-sibling",
+			"preceding-sibling",
+			"following",
+			"preceding",
+			"namespace",
+			"ancestor-or-self" };
 
-    /**
-     * The step axis is child
-     */
-    static final short AXIS_CHILD = 1;
+	/**
+	 * The step axis is child
+	 */
+	static final short AXIS_CHILD = 1;
 
-    /**
-     * The step axis is descendant
-     */
-    static final short AXIS_DESCENDANT = 2;
+	/**
+	 * The step axis is descendant
+	 */
+	static final short AXIS_DESCENDANT = 2;
 
-    /**
-     * The step axis is parent
-     */
-    static final short AXIS_PARENT = 3;
+	/**
+	 * The step axis is parent
+	 */
+	static final short AXIS_PARENT = 3;
 
-    /**
-     * The step axis is attribute
-     */
-    static final short AXIS_ATTRIBUTE = 4;
+	/**
+	 * The step axis is attribute
+	 */
+	static final short AXIS_ATTRIBUTE = 4;
 
-    /**
-     * The step axis is self
-     */
-    static final short AXIS_SELF = 5;
+	/**
+	 * The step axis is self
+	 */
+	static final short AXIS_SELF = 5;
 
-    /**
-     * The step axis is descendant or self
-     */
-    static final short AXIS_DESCENDANT_OR_SELF = 6;
+	/**
+	 * The step axis is descendant or self
+	 */
+	static final short AXIS_DESCENDANT_OR_SELF = 6;
 
-    /**
-     * The step axis is ancestor
-     */
-    static final short AXIS_ANCESTOR = 7;
+	/**
+	 * The step axis is ancestor
+	 */
+	static final short AXIS_ANCESTOR = 7;
 
-    /**
-     * The step axis is following sibling
-     */
-    static final short AXIS_FOLLOWING_SIBLING = 8;
+	/**
+	 * The step axis is following sibling
+	 */
+	static final short AXIS_FOLLOWING_SIBLING = 8;
 
-    /**
-     * The step axis is preceding sibling
-     */
-    static final short AXIS_PRECEDING_SIBLING = 9;
+	/**
+	 * The step axis is preceding sibling
+	 */
+	static final short AXIS_PRECEDING_SIBLING = 9;
 
-    /**
-     * The step axis is following
-     */
-    static final short AXIS_FOLLOWING = 10;
+	/**
+	 * The step axis is following
+	 */
+	static final short AXIS_FOLLOWING = 10;
 
-    /**
-     * The step axis is preceding
-     */
-    static final short AXIS_PRECEDING = 11;
+	/**
+	 * The step axis is preceding
+	 */
+	static final short AXIS_PRECEDING = 11;
 
-    /**
-     * The step axis is namespace
-     */
-    static final short AXIS_NAMESPACE = 12;
+	/**
+	 * The step axis is namespace
+	 */
+	static final short AXIS_NAMESPACE = 12;
 
-    /**
-     * The step axis is ancestor or self
-     */
-    static final short AXIS_ANCESTOR_OR_SELF = 13;
+	/**
+	 * The step axis is ancestor or self
+	 */
+	static final short AXIS_ANCESTOR_OR_SELF = 13;
 
-    /**
-     * Tells whether or not this step is a foward axis step
-     * @return boolean
-     */
-    boolean isForwardStep();
+	/**
+	 * Tells whether this step is a forward axis step.
+	 * Includes the follwing axis: 
+	 * <ul>
+	 * <li>{@link #AXIS_CHILD}</li>
+	 * <li>{@link #AXIS_DESCENDANT}</li>
+	 * <li>{@link #AXIS_DESCENDANT_OR_SELF}</li>
+	 * <li>{@link #AXIS_ATTRIBUTE}</li>
+	 * <li>{@link #AXIS_SELF}</li>
+	 * <li>{@link #AXIS_FOLLOWING}</li>
+	 * <li>{@link #AXIS_FOLLOWING_SIBLING}</li>
+	 * <li>{@link #AXIS_NAMESPACE}</li> 
+	 * </ul>
+	 * @return true whenever {@link #getAxisType()} returns one the 
+	 * constants right above.
+	 */
+	boolean isForwardStep();
 
-    /**
-     * Tells whether or not this step is a reversed axis step
-     * @return boolean
-     */
-    boolean isReversedStep();
+	/**
+	 * Tells whether this step is a reversed axis step.
+	 * Includes the following axis: 
+	 * <ul>
+	 * <li>{@link #AXIS_PARENT}</li>
+	 * <li>{@link #AXIS_ANCESTOR}</li> 
+	 * <li>{@link #AXIS_PRECEDING}</li>
+	 * <li>{@link #AXIS_PRECEDING_SIBLING}</li>
+	 * <li>{@link #AXIS_ANCESTOR_OR_SELF}</li>
+	 * </ul> 
+	 * @return true whenever {@link #getAxisType()} returns one the 
+	 * constants right above.
+	 */
+	boolean isReversedStep();
 
-    /**
-     * Tells whether or not this step is a filter step.
-     * @return boolean
-     */
-    boolean isPrimaryExpr();
+	/**
+	 * Tells whether this step is a filter step
+	 * @return boolean
+	 */
+	boolean isFilterStep();
 
-    /**
-     * Gets the type of step axis
-     *
-     * @return short The axis type corresponding to one of the constants defined above.
-     * @throws XPath20Exception whenever the step is neither a forward step nor a reverse
-     *         step.
-     */
-    short getAxisType() throws XPath20Exception;
+	/**
+	 * Gets the type of step axis
+	 * @return short The axis type corresponding to one of the constants defined above.
+	 * @throws XPath20Exception whenever the step isn't an axis step
+	 */
+	short getAxisType() throws XPath20Exception;
 
-    /**
-     * Sets the type of the step axis
-     * @param newType The new axis type
-     * @throws XPath20Exception whenever the step is not a forward or reverse
-     *         step.
-     */
-    void setAxisType(short newType) throws XPath20Exception;
+	/**
+	 * Sets the type of the step axis
+	 * @param newType The new axis type
+	 * @throws XPath20Exception whenever the step isn't an axis step
+	 */
+	void setAxisType(short newType) throws XPath20Exception;
 
-    /**
-     * Gets the name of the step axis
-     *
-     * @return String Full name of the step axis
-     * @throws XPath20Exception whenever the step is not a forward or reverse
-     *         step.
-     */
-    String getAxisName() throws XPath20Exception;
+	/**
+	 * Gets the name of the step axis
+	 * @return String Full name of the step axis
+	 * @throws XPath20Exception whenever the step isn't an axis step
+	 */
+	String getAxisName() throws XPath20Exception;
 
-    /**
-     * Gets the node test 
-     *
-     * @return NodeTest
-     * @throws XPath20Exception whenever the step is not a forward or reverse
-     *          step.
-     */
-    NodeTest getNodeTest() throws XPath20Exception;
-    
+	/**
+	 * Gets the node test 
+	 * @return NodeTest
+	 * @throws XPath20Exception whenever the step isn't an axis step
+	 */
+	NodeTest getNodeTest() throws XPath20Exception;
+
 	/**
 	 * Sets the node test 
-	 *
 	 * @param NodeTest
-	 * @throws XPath20Exception whenever the step is not a forward or reverse
-	 *          step.
+	 * @throws XPath20Exception whenever the step isn't an axis step
 	 */
 	void setNodeTest(NodeTest test) throws XPath20Exception;
 
+	/**
+	 * Gets the primary expression of the filter step. 
+	 * @return Expr The primary expression 
+	 * @throws XPath20Exception whenever the step isn't a filter step
+	 */
+	Expr getPrimaryExpr() throws XPath20Exception;
 
-    /**
-     * Gets the step as a primary expression. 
-     *
-     * @return Expr The primary expression 
-     */
-    Expr getPrimaryExpr() throws XPath20Exception;
+	/**
+	 * Gets the predicate expression at the specified position
+	 * @param i index of the predicate to return
+	 * @return The predicate at the ith position
+	 * @throws java.lang.ArrayIndexOutOfBoundsException
+	 */
+	Expr getPredicateAt(int i);
 
-    /**
-     * Gets the predicate expression at the specified position
-     * @param i index of the predicate to return
-     * @return The predicate at the ith position
-     * @throws java.lang.ArrayIndexOutOfBoundsException
-     */
-    Expr getPredicateAt(int i);
+	/**
+	 * Gets the number of predicate
+	 * @return The number of predicates
+	 */
+	int getPredicateCount();
 
-    /**
-     * Gets the number of predicate
-     *
-     * @return The number of predicates
-     */
-    int getPredicateCount();
+	/**
+	 * Append the specified predicate at the end of the list of
+	 * predicates
+	 * @param predicate The predicate to append
+	 */
+	void appendPredicate(Expr predicate);
 
-    /**
-     * Append the specified predicate
-     * @param predicate The predicate to append
-     */
-    void appendPredicate(Expr predicate);
-
-    /**
-     * Remove the specified predicate
-     */
-    void removePredicate(Expr predicate);
+	/**
+	 * Remove the specified predicate
+	 */
+	void removePredicate(Expr predicate);
 }
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java b/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
index c86af80..13eadf1 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
@@ -59,16 +59,19 @@
 import org.apache.xpath.XPath20Exception;
 
 /**
- * Represents variable.
+ * Represents <em>variable</em> references.
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
  */
-public interface Variable extends Expr {
+public interface Variable extends Expr
+{
 
-   /**
-     * Gets the name of the variable.
-     * @return String
-     */
-    QName getVariableName();
-    
+	/**
+	 * Gets the name of the variable.
+	 * @return String
+	 */
+	QName getVariableName();
+
 	/**
 	 * Sets the name of the variable.
 	 * @param name New name of the variable
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/package.html b/xpath_rwapi/src2/org/apache/xpath/expression/package.html
index 689ec96..c32a94f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/package.html
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/package.html
@@ -6,21 +6,25 @@
 <body>
 <p>Public interfaces for XPath expression Abstract Syntax Tree nodes.
 Primary external APIs for this XPath AST model.</p>
-<p>This XPath API is a compact set of Java interfaces that allow to
-encode and handle XPath 2.0/XQuery 1.0 expressions (although only XPath
-2.0 expressions are currently supported except for the let expression).
-It was designed to fulfill
+<p>This XPath API is a compact set of Java interfaces that allow the
+in-memory representation and manipulation of XPath 2.0 expressions.The
+main idea of this API is to manipulate XPath expressions independently
+of their actual underlying representation.<br>
+</p>
+<p>It was designed to fulfill
 the following requirements:</p>
 <ul>
   <li style="font-weight: bold;">Read/Write: <span
- style="font-weight: normal;">capability of visiting and modifying the
-internal representation of expressions. The expression reading is
+ style="font-weight: normal;">it should be capable of querying/visiting
+and modifying the
+internal representation of XPath expressions. The expression reading is
 performed by using either the visitor pattern or get-like methods.
 Similarly, the</span><span style="font-weight: normal;"> expression </span><span
  style="font-weight: normal;">writing is done through a bunch of
 set-like methods.</span></li>
   <li style="font-weight: bold;"><span style="font-weight: normal;"><span
- style="font-weight: bold;">Round-trip: </span>capability of getting
+ style="font-weight: bold;">Round-trip: </span>it should be capable of
+getting
 string representation of expressions from its internal encoding.<br>
     </span></li>
   <li><span style="font-weight: bold;">Application-independent</span>:
@@ -30,14 +34,15 @@
 namespace/qname manager and AST generalization and specialisation (see
 implementation package).<span style="font-weight: bold;"><br>
     </span></li>
-  <li style="font-weight: bold;">Compactness: <span
- style="font-weight: normal;">keep the interface set as minimal as
-possible by factoring similar concepts. The best example is the
-interface OperatorExpr which allows to represent more than ten
+  <li style="font-weight: bold;">Lightweight: <span
+ style="font-weight: normal;">it should be compact and therefore should
+define a minimal set of Java interfaces in particular by factoring
+similar concepts. The best example is the
+interface OperatorExpr which allows the representation of more than ten
 expression types.</span></li>
 </ul>
-Right now, the XPath API do not provide a standard way to evaluate
-expressions. This should be done.<br>
+Right now, the XPath API do not provide a standard way to request the
+evaluation of expressions. This should be done.<br>
 <p></p>
 </body>
 </html>
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
index 25b0f4a..8e50990 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
@@ -55,10 +55,11 @@
  */
 package org.apache.xpath.impl;
 
-import org.apache.xml.QName;
-
 import org.apache.xpath.XPath20Exception;
+import org.apache.xpath.expression.Expr;
+import org.apache.xpath.expression.NameTest;
 import org.apache.xpath.expression.NodeTest;
+import org.apache.xpath.expression.Visitor;
 import org.apache.xpath.impl.parser.Node;
 import org.apache.xpath.impl.parser.SimpleNode;
 import org.apache.xpath.impl.parser.XPath;
@@ -80,7 +81,7 @@
     /**
      * PI target
      */
-    protected QName m_pitarget;
+    protected NameTestImpl m_pitarget;
 
     /**
      * Creates an any kind test node. Internal uses only
@@ -154,7 +155,7 @@
     /**
      * @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
      */
-    public QName getNameTest() throws XPath20Exception
+    public NameTest getNameTest() throws XPath20Exception
     {
     	if (m_kindTest == PROCESSING_INSTRUCTION_TEST)
     	{
@@ -166,14 +167,30 @@
     	}
     }
 
-    /**
-     * @see org.apache.xpath.expression.Expr#getString(boolean)
-     */
+	// Implements Expr
+
     public String getString(boolean abbreviate)
     {
         return KIND_TEST_NAME[m_kindTest];
     }
 
+	public Expr cloneExpression()
+	{
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public short getExprType()
+	{
+		return Expr.NODE_TEST;
+	}
+
+	public boolean visit(Visitor visitor)
+	{
+		// TODO Auto-generated method stub
+		return false;
+	}
+
     /**
      * @see org.apache.xpath.impl.parser.Node#jjtAddChild(Node, int)
      */
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
index 7ead8fb..0542832 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
@@ -56,111 +56,174 @@
 package org.apache.xpath.impl;
 
 import org.apache.xml.QName;
-
 import org.apache.xpath.XPath20Exception;
+import org.apache.xpath.expression.Expr;
+import org.apache.xpath.expression.NameTest;
 import org.apache.xpath.expression.NodeTest;
+import org.apache.xpath.expression.Visitor;
 import org.apache.xpath.impl.parser.Node;
+import org.apache.xpath.impl.parser.QNameWrapper;
 import org.apache.xpath.impl.parser.SimpleNode;
 import org.apache.xpath.impl.parser.XPathTreeConstants;
 
-
 /**
  * Default implementation of name test.
  */
-public class NameTestImpl extends SimpleNode implements NodeTest
+public class NameTestImpl extends SimpleNode implements NodeTest, NameTest
 {
-    /**
-     * Name test
-     */
-    QName m_qname;
+	/**
+	 * Name test
+	 */
+	QName m_qname;
 
-    /**
-     * Constructor for NameTestImpl. Internal uses only
-     *
-     * @param i
-     */
-    public NameTestImpl(int i)
-    {
-        super(i);
-    }
+	/**
+	 * NCName
+	 */
+	String m_ncname;
 
-    /**
-     * Constructor for NodeTestImpl. Internal uses only
-     */
-    public NameTestImpl(QName qname)
-    {
-        super(XPathTreeConstants.JJTNAMETEST);
+	/**
+	 * Nametest type
+	 */
+	short m_type;
 
-        m_qname = qname;
-    }
-    	
-    /**
-     * @see org.apache.xpath.expression.NodeTest#isNameTest()
-     */
-    public boolean isNameTest()
-    {
-        return true;
-    }
+	// Constructors
 
-    /**
-     * @see org.apache.xpath.expression.NodeTest#isKindTest()
-     */
-    public boolean isKindTest()
-    {
-        return false;
-    }
+	/**
+	 * Constructor for NameTestImpl. Internal uses only
+	 *
+	 * @param i
+	 */
+	public NameTestImpl(int i)
+	{
+		super(i);
+	}
 
-    /**
-     * @see org.apache.xpath.expression.NodeTest#getKindTest()
-     */
-    public short getKindTest() throws XPath20Exception
-    {
-        throw new XPath20Exception("Invalid call of this method on NameTest node"); //I8
-    }
+	/**
+	 * Constructor for NodeTestImpl. Internal uses only
+	 */
+	public NameTestImpl(QName qname)
+	{
+		super(XPathTreeConstants.JJTNAMETEST);
 
-    /**
-     * @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
-     */
-    public QName getNameTest() throws XPath20Exception
-    {
-        return m_qname;
-    }
-  
-    /**
-     * @see org.apache.xpath.expression.Expr#getString(boolean)
-     */
-    public String getString(boolean abbreviate)
-    {
-        return m_qname.toString();
-    }
+		m_qname = qname;
+		m_type = QNAME;
+	}
 
- 
-    /**
-     * @see org.apache.xpath.impl.parser.Node#jjtAddChild(Node, int)
-     */
-    public void jjtAddChild(Node n, int i)
-    {
-        // don't add n in the tree
-        m_qname = ((org.apache.xpath.impl.parser.QNameWrapper) n).getQName();
-    }
+	/**
+	 * @see org.apache.xpath.expression.NodeTest#isNameTest()
+	 */
+	public boolean isNameTest()
+	{
+		return true;
+	}
 
-    /**
-     * @see org.apache.xpath.impl.ExprImpl#getString(StringBuffer,
-     *      boolean)
-     */
-    public void getString(StringBuffer expr, boolean abbreviate)
-    {
-        expr.append(m_qname.toString());
-    }
+	/**
+	 * @see org.apache.xpath.expression.NodeTest#isKindTest()
+	 */
+	public boolean isKindTest()
+	{
+		return false;
+	}
 
-    /**
-     * Override to print out useful instance data.
-     *
-     * @see org.apache.xpath.impl.parser.SimpleNode#toString()
-     */
-    public String toString()
-    {
-        return XPathTreeConstants.jjtNodeName[id] + " " + getClass() + " "
-        + getString(false);
-    }
+	/**
+	 * @see org.apache.xpath.expression.NodeTest#getKindTest()
+	 */
+	public short getKindTest() throws XPath20Exception
+	{
+		throw new XPath20Exception("Invalid call of this method on NameTest node");
+		//I8
+	}
+
+	/**
+	 * @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
+	 */
+	public NameTest getNameTest() throws XPath20Exception
+	{
+		return this;
+	}
+
+	// Implements Expr
+	
+	public String getString(boolean abbreviate)
+	{
+		switch (m_type)
+		{
+			case WILDCARD :
+				return "*";
+			case QNAME :
+				return m_qname.toString();
+			case NCNAME_WILDCARD :
+				return m_ncname + ":*";
+			case WILDCARD_NCNAME :
+				return "*:" + m_ncname;
+				default:
+				throw new IllegalStateException("Invalid NameTest type " + m_type);
+		}
+	}
+
+	//
+	public Expr cloneExpression()
+	{
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public short getExprType()
+	{
+		return NODE_TEST;
+	}
+
+	//
+	public boolean visit(Visitor visitor)
+	{
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public void jjtAddChild(Node n, int i)
+	{
+		QNameWrapper w = (QNameWrapper) n;
+		
+		m_type = w.m_type;
+		m_ncname = w.m_ncname;
+		m_qname = w.getQName();
+	}
+
+	public void getString(StringBuffer expr, boolean abbreviate)
+	{
+		expr.append(getString(abbreviate));
+	}
+
+	/**
+	 * Override to print out useful instance data.
+	 *
+	 * @see org.apache.xpath.impl.parser.SimpleNode#toString()
+	 */
+	public String toString()
+	{
+		return XPathTreeConstants.jjtNodeName[id]
+			+ " "
+			+ getClass()
+			+ " "
+			+ getString(false);
+	}
+
+	// Implements NameTest
+
+	public QName getName()
+	{
+		return m_qname;
+	}
+
+	public String getNCName()
+	{
+		return m_ncname;
+	}
+
+	public short getNameTestType()
+	{
+		return m_type;
+	}
+
+	
 }
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
index a50bb44..27f2f0c 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
@@ -206,7 +206,7 @@
 			int et = step.getExprType();
 
 			return (
-				((et == STEP) && ((StepExpr) step).isPrimaryExpr())
+				((et == STEP) && ((StepExpr) step).isFilterStep())
 					|| (et == LITERAL_EXPR)
 					|| (et == FUNCTION_CALL_EXPR)
 					|| (et == SEQUENCE_EXPR)
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
index 9355394..078614f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
@@ -194,7 +194,7 @@
     /**
      * @see org.apache.xpath.expression.StepExpr#isPrimaryExpr()
      */
-    public boolean isPrimaryExpr()
+    public boolean isFilterStep()
     {
         return m_axisType == STEP_IS_PRIMARYEXPR;
     }
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
index 9a09466..7d87244 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
@@ -58,7 +58,7 @@
 import org.apache.xpath.expression.StepExpr;
 
 /**
- * Represent an Axis AST node.  
+ * Represents an Axis AST node.  
  */
 public class Axis extends SimpleNode {
 
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
index a5458c5..d676604 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
@@ -81,8 +81,6 @@
 public class DefaultNodeFactory implements NodeFactory 
 {
 
-	final static public String FACTORY_PROPERTY_KEY = "org.apache.xpath.impl.parser.NodeFactory";
-
 	final static private NodeFactory DEFAULT_NODE_FACTORY = new DefaultNodeFactory();
 
 	static protected NodeFactory createNodeFactory()
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
index 64830dc..d185489 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
@@ -75,6 +75,10 @@
  */
 public interface NodeFactory
 {
+	final static public String FACTORY_PROPERTY_KEY = "org.apache.xpath.impl.parser.NodeFactory";
+
+
+	
     /**
      * Creates NameTest AST node
      *
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
index 507150d..cd6f407 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
@@ -56,6 +56,7 @@
 package org.apache.xpath.impl.parser;
 
 import org.apache.xml.QName;
+import org.apache.xpath.expression.NameTest;
 
 /**
  * QNameNode wrappers a 'real' QName object.
@@ -69,6 +70,9 @@
 	 * The wrapped QName
 	 */
 	QName m_qname;
+	
+	public short m_type;
+	public String m_ncname;
 
 	/**
 	 * Constructor for QName.
@@ -89,36 +93,31 @@
 		super(p, i);
 	}
 
-	/**
-	 * @see org.apache.xpath.impl.parser.SimpleNode#processToken(Token)
-	 */
 	public void processToken(Token t)
 	{
 		super.processToken(t);
-		String qname;
+
 		switch (id)
 		{
 			case XPathTreeConstants.JJTSTAR :
-				m_qname =
-					SimpleNode.getExpressionFactory().createQName(
-						null,
-						"*",
-						null);
+				m_type = NameTest.WILDCARD;
 				break;
 			case XPathTreeConstants.JJTSTARCOLONNCNAME :
-				qname = t.image.trim();
-				qname = qname.substring(qname.indexOf(":") + 1);
-				m_qname =
-					SimpleNode.getExpressionFactory().createQName(
-						null,
-						qname,
-						"*");
+				m_ncname = t.image.trim();
+				m_ncname = m_ncname.substring(m_ncname.indexOf(":") + 1);
+				m_type = NameTest.WILDCARD_NCNAME;
 
 				break;
 			case XPathTreeConstants.JJTNCNAMECOLONSTAR :
+				m_ncname = t.image.trim();
+				m_ncname = m_ncname.substring(0, m_ncname.indexOf(":"));
+				m_type = NameTest.NCNAME_WILDCARD;
+
+				break;
+
 			case XPathTreeConstants.JJTQNAME :
 			case XPathTreeConstants.JJTQNAMELPAR :
-				qname = t.image;
+				String qname = t.image;
 				int parenIndex = qname.lastIndexOf("(");
 				if (parenIndex > 0)
 				{
@@ -133,8 +132,7 @@
 							null,
 							qname,
 							null);
-				}
-				else
+				} else
 				{
 					m_qname =
 						SimpleNode.getExpressionFactory().createQName(
@@ -142,6 +140,7 @@
 							qname.substring(colonIdx + 1),
 							qname.substring(0, colonIdx));
 				}
+				m_type = NameTest.QNAME;
 				break;
 
 			default :
@@ -150,9 +149,7 @@
 		}
 	}
 
-	/**
-	 * @return org.apache.xml.QName
-	 */
+	
 	public org.apache.xml.QName getQName()
 	{
 		return m_qname;
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
index a9984b6..b11b840 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
@@ -243,15 +243,15 @@
                 break;
 
             // The nodes belows are filtered: no customisation possible
-            case XPathTreeConstants.JJTQNAME:
-            case XPathTreeConstants.JJTQNAMELPAR:
+            
             case XPathTreeConstants.JJTSTAR:
             case XPathTreeConstants.JJTNCNAMECOLONSTAR:
             case XPathTreeConstants.JJTSTARCOLONNCNAME:
-                newNode = new QNameWrapper(id);
-
-                break;
-
+			case XPathTreeConstants.JJTQNAME:    
+			case XPathTreeConstants.JJTQNAMELPAR:    
+				newNode = new QNameWrapper(id);
+				break;
+				
             case XPathTreeConstants.JJTDOTDOT:
                 newNode = Singletons.DOTDOT;