diff --git a/src/org/w3c/dom/ranges/DocumentRange.java b/src/org/w3c/dom/ranges/DocumentRange.java
deleted file mode 100644
index 6b52267..0000000
--- a/src/org/w3c/dom/ranges/DocumentRange.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-/**
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public interface DocumentRange {
-    /**
-     * This interface can be obtained from the object implementing the 
-     * <code>Document</code> interface using binding-specific casting 
-     * methods.
-     * @return The initial state of the Range returned from this method is 
-     *   such that both of its boundary-points are positioned at the 
-     *   beginning of the corresponding Document, before any content. The 
-     *   Range returned can only be used to select content associated with 
-     *   this Document, or with DocumentFragments and Attrs for which this 
-     *   Document is the <code>ownerDocument</code>.
-     */
-    public Range createRange();
-
-}
diff --git a/src/org/w3c/dom/ranges/Range.java b/src/org/w3c/dom/ranges/Range.java
deleted file mode 100644
index 7743abe..0000000
--- a/src/org/w3c/dom/ranges/Range.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DOMException;
-
-/**
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public interface Range {
-    /**
-     * Node within which the Range begins 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public Node getStartContainer()
-                       throws DOMException;
-
-    /**
-     * Offset within the starting node of the Range. 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public int getStartOffset()
-                       throws DOMException;
-
-    /**
-     * Node within which the Range ends 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public Node getEndContainer()
-                       throws DOMException;
-
-    /**
-     * Offset within the ending node of the Range. 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public int getEndOffset()
-                       throws DOMException;
-
-    /**
-     * TRUE if the Range is collapsed 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public boolean getCollapsed()
-                       throws DOMException;
-
-    /**
-     * The deepest common ancestor container of the Range's two 
-     * boundary-points.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public Node getCommonAncestorContainer()
-                       throws DOMException;
-
-    /**
-     * Sets the attributes describing the start of the Range. 
-     * @param refNodeThe <code>refNode</code> value. This parameter must be 
-     *   different from <code>null</code>.
-     * @param offsetThe <code>startOffset</code> value. 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor 
-     *   of <code>refNode</code> is an Entity, Notation, or DocumentType 
-     *   node.
-     * @exception DOMException
-     *   INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater 
-     *   than the number of child units in <code>refNode</code>. Child units 
-     *   are 16-bit units if <code>refNode</code> is a type of CharacterData 
-     *   node (e.g., a Text or Comment node) or a ProcessingInstruction 
-     *   node. Child units are Nodes in all other cases.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public void setStart(Node refNode, 
-                         int offset)
-                         throws RangeException, DOMException;
-
-    /**
-     * Sets the attributes describing the end of a Range.
-     * @param refNodeThe <code>refNode</code> value. This parameter must be 
-     *   different from <code>null</code>.
-     * @param offsetThe <code>endOffset</code> value. 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor 
-     *   of <code>refNode</code> is an Entity, Notation, or DocumentType 
-     *   node.
-     * @exception DOMException
-     *   INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater 
-     *   than the number of child units in <code>refNode</code>. Child units 
-     *   are 16-bit units if <code>refNode</code> is a type of CharacterData 
-     *   node (e.g., a Text or Comment node) or a ProcessingInstruction 
-     *   node. Child units are Nodes in all other cases.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public void setEnd(Node refNode, 
-                       int offset)
-                       throws RangeException, DOMException;
-
-    /**
-     * Sets the start position to be before a node
-     * @param refNodeRange starts before <code>refNode</code> 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if the root container of 
-     *   <code>refNode</code> is not an Attr, Document, or DocumentFragment 
-     *   node or if <code>refNode</code> is a Document, DocumentFragment, 
-     *   Attr, Entity, or Notation node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void setStartBefore(Node refNode)
-                               throws RangeException, DOMException;
-
-    /**
-     * Sets the start position to be after a node
-     * @param refNodeRange starts after <code>refNode</code> 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if the root container of 
-     *   <code>refNode</code> is not an Attr, Document, or DocumentFragment 
-     *   node or if <code>refNode</code> is a Document, DocumentFragment, 
-     *   Attr, Entity, or Notation node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void setStartAfter(Node refNode)
-                              throws RangeException, DOMException;
-
-    /**
-     * Sets the end position to be before a node. 
-     * @param refNodeRange ends before <code>refNode</code> 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if the root container of 
-     *   <code>refNode</code> is not an Attr, Document, or DocumentFragment 
-     *   node or if <code>refNode</code> is a Document, DocumentFragment, 
-     *   Attr, Entity, or Notation node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void setEndBefore(Node refNode)
-                             throws RangeException, DOMException;
-
-    /**
-     * Sets the end of a Range to be after a node 
-     * @param refNodeRange ends after <code>refNode</code>. 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if the root container of 
-     *   <code>refNode</code> is not an Attr, Document or DocumentFragment 
-     *   node or if <code>refNode</code> is a Document, DocumentFragment, 
-     *   Attr, Entity, or Notation node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void setEndAfter(Node refNode)
-                            throws RangeException, DOMException;
-
-    /**
-     * Collapse a Range onto one of its boundary-points 
-     * @param toStartIf TRUE, collapses the Range onto its start; if FALSE, 
-     *   collapses it onto its end. 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void collapse(boolean toStart)
-                         throws DOMException;
-
-    /**
-     * Select a node and its contents 
-     * @param refNodeThe node to select. 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if an ancestor of <code>refNode</code> 
-     *   is an Entity, Notation or DocumentType node or if 
-     *   <code>refNode</code> is a Document, DocumentFragment, Attr, Entity, 
-     *   or Notation node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void selectNode(Node refNode)
-                           throws RangeException, DOMException;
-
-    /**
-     * Select the contents within a node 
-     * @param refNodeNode to select from 
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor 
-     *   of <code>refNode</code> is an Entity, Notation or DocumentType node.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void selectNodeContents(Node refNode)
-                                   throws RangeException, DOMException;
-
-    // CompareHow
-    /**
-     * Compare start boundary-point of <code>sourceRange</code> to start 
-     * boundary-point of Range on which <code>compareBoundaryPoints</code> 
-     * is invoked.
-     */
-    public static final short START_TO_START            = 0;
-    /**
-     * Compare start boundary-point of <code>sourceRange</code> to end 
-     * boundary-point of Range on which <code>compareBoundaryPoints</code> 
-     * is invoked.
-     */
-    public static final short START_TO_END              = 1;
-    /**
-     * Compare end boundary-point of <code>sourceRange</code> to end 
-     * boundary-point of Range on which <code>compareBoundaryPoints</code> 
-     * is invoked.
-     */
-    public static final short END_TO_END                = 2;
-    /**
-     * Compare end boundary-point of <code>sourceRange</code> to start 
-     * boundary-point of Range on which <code>compareBoundaryPoints</code> 
-     * is invoked.
-     */
-    public static final short END_TO_START              = 3;
-
-    /**
-     * Compare the boundary-points of two Ranges in a document.
-     * @param howA code representing the type of comparison, as defined above.
-     * @param sourceRangeThe <code>Range</code> on which this current 
-     *   <code>Range</code> is compared to.
-     * @return  -1, 0 or 1 depending on whether the corresponding 
-     *   boundary-point of the Range is respectively before, equal to, or 
-     *   after the corresponding boundary-point of <code>sourceRange</code>. 
-     * @exception DOMException
-     *   WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same 
-     *   Document or DocumentFragment.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public short compareBoundaryPoints(short how, 
-                                       Range sourceRange)
-                                       throws DOMException;
-
-    /**
-     * Removes the contents of a Range from the containing document or 
-     * document fragment without returning a reference to the removed 
-     * content.  
-     * @exception DOMException
-     *   NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of 
-     *   the Range is read-only or any of the nodes that contain any of the 
-     *   content of the Range are read-only.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public void deleteContents()
-                               throws DOMException;
-
-    /**
-     * Moves the contents of a Range from the containing document or document 
-     * fragment to a new DocumentFragment. 
-     * @return A DocumentFragment containing the extracted contents. 
-     * @exception DOMException
-     *   NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of 
-     *   the Range is read-only or any of the nodes which contain any of the 
-     *   content of the Range are read-only.
-     *   <br>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be 
-     *   extracted into the new DocumentFragment.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public DocumentFragment extractContents()
-                                            throws DOMException;
-
-    /**
-     * Duplicates the contents of a Range 
-     * @return A DocumentFragment that contains content equivalent to this 
-     *   Range.
-     * @exception DOMException
-     *   HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be 
-     *   extracted into the new DocumentFragment.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     */
-    public DocumentFragment cloneContents()
-                                          throws DOMException;
-
-    /**
-     * Inserts a node into the Document or DocumentFragment at the start of 
-     * the Range. If the container is a Text node, this will be split at the 
-     * start of the Range (as if the Text node's splitText method was 
-     * performed at the insertion point) and the insertion will occur 
-     * between the two resulting Text nodes. Adjacent Text nodes will not be 
-     * automatically merged. If the node to be inserted is a 
-     * DocumentFragment node, the children will be inserted rather than the 
-     * DocumentFragment node itself.
-     * @param newNodeThe node to insert at the start of the Range 
-     * @exception DOMException
-     *   NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of the 
-     *   start of the Range is read-only.
-     *   <br>WRONG_DOCUMENT_ERR: Raised if <code>newNode</code> and the 
-     *   container of the start of the Range were not created from the same 
-     *   document.
-     *   <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of 
-     *   the Range is of a type that does not allow children of the type of 
-     *   <code>newNode</code> or if <code>newNode</code> is an ancestor of 
-     *   the container.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     * @exception RangeException
-     *   INVALID_NODE_TYPE_ERR: Raised if <code>newNode</code> is an Attr, 
-     *   Entity, Notation, or Document node.
-     */
-    public void insertNode(Node newNode)
-                           throws DOMException, RangeException;
-
-    /**
-     * Reparents the contents of the Range to the given node and inserts the 
-     * node at the position of the start of the Range. 
-     * @param newParentThe node to surround the contents with. 
-     * @exception DOMException
-     *   NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of 
-     *   either boundary-point of the Range is read-only.
-     *   <br>WRONG_DOCUMENT_ERR: Raised if <code> newParent</code> and the 
-     *   container of the start of the Range were not created from the same 
-     *   document.
-     *   <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of 
-     *   the Range is of a type that does not allow children of the type of 
-     *   <code>newParent</code> or if <code>newParent</code> is an ancestor 
-     *   of the container or if <code>node</code> would end up with a child 
-     *   node of a type not allowed by the type of <code>node</code>.
-     *   <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already 
-     *   been invoked on this object.
-     * @exception RangeException
-     *   BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a 
-     *   non-text node.
-     *   <br>INVALID_NODE_TYPE_ERR: Raised if <code> node</code> is an Attr, 
-     *   Entity, DocumentType, Notation, Document, or DocumentFragment node.
-     */
-    public void surroundContents(Node newParent)
-                                 throws DOMException, RangeException;
-
-    /**
-     * Produces a new Range whose boundary-points are equal to the 
-     * boundary-points of the Range. 
-     * @return The duplicated Range. 
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public Range cloneRange()
-                            throws DOMException;
-
-    /**
-     * Returns the contents of a Range as a string. This string contains only 
-     * the data characters, not any markup. 
-     * @return The contents of the Range.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public String toString()
-                           throws DOMException;
-
-    /**
-     * Called to indicate that the Range is no longer in use and that the 
-     * implementation may relinquish any resources associated with this 
-     * Range. Subsequent calls to any methods or attribute getters on this 
-     * Range will result in a <code>DOMException</code> being thrown with an 
-     * error code of <code>INVALID_STATE_ERR</code>.
-     * @exception DOMException
-     *   INVALID_STATE_ERR: Raised if <code>detach()</code> has already been 
-     *   invoked on this object.
-     */
-    public void detach()
-                       throws DOMException;
-
-}
diff --git a/src/org/w3c/dom/ranges/RangeException.java b/src/org/w3c/dom/ranges/RangeException.java
deleted file mode 100644
index 551008e..0000000
--- a/src/org/w3c/dom/ranges/RangeException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-/**
- * Range operations may throw a <code>RangeException</code> as specified in 
- * their method descriptions.
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public class RangeException extends RuntimeException {
-    public RangeException(short code, String message) {
-       super(message);
-       this.code = code;
-    }
-    public short   code;
-    // RangeExceptionCode
-    /**
-     * If the boundary-points of a Range do not meet specific requirements.
-     */
-    public static final short BAD_BOUNDARYPOINTS_ERR    = 1;
-    /**
-     * If the container of an boundary-point of a Range is being set to either 
-     * a node of an invalid type or a node with an ancestor of an invalid 
-     * type.
-     */
-    public static final short INVALID_NODE_TYPE_ERR     = 2;
-
-}
diff --git a/src/org/w3c/dom/ranges/package.html b/src/org/w3c/dom/ranges/package.html
deleted file mode 100644
index 8b9d80f..0000000
--- a/src/org/w3c/dom/ranges/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
-  <title>org.w3c.dom.ranges Package</title>
-  <body>
-    <p>DOM level 2 range interfaces.<p>
- </body>
-</html>
-
-
diff --git a/src/trax/trax.properties b/src/trax/trax.properties
deleted file mode 100644
index e593c39..0000000
--- a/src/trax/trax.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# $Revision$ $Date$
-#
-# Note: This properties file is provided for illustrative purposes
-#       only and is not part of the interface definition.
-#       This properties file is located in the implementation JAR
-#       and different implementations will specify different
-#       implementation classes and output methods.
-#
-
-# The TRaX Stylesheet processor
-trax.processor.xslt=org.apache.xalan.processor.StylesheetProcessor
