diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/COPYRIGHT.html b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/COPYRIGHT.html
index 4c77b68..1d48a66 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/COPYRIGHT.html
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/COPYRIGHT.html
@@ -1,90 +1,77 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
-    <title>W3C IPR SOFTWARE NOTICE</title>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+<title>W3C IPR SOFTWARE NOTICE</title>
 <style type="text/css">
 <!--
 html, body { background: #fff; color: #000; } /* body for Windows IE3 */
 -->
 </style>
-  </head>
-  <body>
-    <h1>
-      W3C SOFTWARE NOTICE AND LICENSE
-    </h1>
-    <h3>
-      Copyright &copy; 2004 <a href="http://www.w3.org/">World Wide Web
-      Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts
-      Institute of Technology</a>, <a
-      href="http://www.ercim.org/">European Research Consortium for
-      Informatics and Mathematics</a>, <a
-      href="http://www.keio.ac.jp/">Keio University</a>). All Rights
-      Reserved.
-    </h3>
-    <p>
-      The DOM bindings are published under the W3C Software Copyright Notice
-      and License. The software license requires "Notice of any changes or
-      modifications to the W3C files, including the date changes were made."
-      Consequently, modified versions of the DOM bindings must document that
-      they do not conform to the W3C standard; in the case of the IDL
-      definitions, the pragma prefix can no longer be 'w3c.org'; in the case of
-      the Java language binding, the package names can no longer be in the
-      'org.w3c' package.
-    </p>
-    <p>
-      <b>Note:</b> The original version of the W3C Software Copyright Notice
-      and License could be found at <a
-      href='http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231'>http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</a>
-    </p>
-    <p>
-      This work (and included software, documentation such as READMEs,
-      or other related items) is being provided by the copyright holders
-      under the following license. By obtaining, using and/or copying
-      this work, you (the licensee) agree that you have read,
-      understood, and will comply with the following terms and
-      conditions.
-    </p>
+</head>
+<body>
+<h1>W3C SOFTWARE NOTICE AND LICENSE</h1>
+<h3>Copyright &copy; 2004 <a href="http://www.w3.org/">World Wide Web
+Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts
+Institute of Technology</a>, <a href="http://www.ercim.org/">European
+Research Consortium for Informatics and Mathematics</a>, <a
+	href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved.</h3>
+<p>The DOM bindings are published under the W3C Software Copyright
+Notice and License. The software license requires "Notice of any changes
+or modifications to the W3C files, including the date changes were
+made." Consequently, modified versions of the DOM bindings must document
+that they do not conform to the W3C standard; in the case of the IDL
+definitions, the pragma prefix can no longer be 'w3c.org'; in the case
+of the Java language binding, the package names can no longer be in the
+'org.w3c' package.</p>
+<p><b>Note:</b> The original version of the W3C Software Copyright
+Notice and License could be found at <a
+	href='http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231'>http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</a>
+</p>
+<p>This work (and included software, documentation such as READMEs, or
+other related items) is being provided by the copyright holders under
+the following license. By obtaining, using and/or copying this work, you
+(the licensee) agree that you have read, understood, and will comply
+with the following terms and conditions.</p>
 
-    <p>
-      Permission to copy, modify, and distribute this software and its
-      documentation, with or without modification,&nbsp;for any purpose
-      and without fee or royalty is hereby granted, provided that you
-      include the following on ALL copies of the software and
-      documentation or portions thereof, including modifications:
-    </p>
-    <ol>
-      <li>The full text of this NOTICE in a location viewable to users
-      of the redistributed or derivative work.</li>
+<p>Permission to copy, modify, and distribute this software and its
+documentation, with or without modification,&nbsp;for any purpose and
+without fee or royalty is hereby granted, provided that you include the
+following on ALL copies of the software and documentation or portions
+thereof, including modifications:</p>
+<ol>
+	<li>The full text of this NOTICE in a location viewable to users of the
+	redistributed or derivative work.</li>
 
-      <li>Any pre-existing intellectual property disclaimers, notices,
-      or terms and conditions. If none exist, the <a
-      href="http://www.w3.org/Consortium/Legal/2002/copyright-software-short-notice-20021231.html">W3C
-      Software Short Notice</a> should be included (hypertext is
-      preferred, text is permitted) within the body of any redistributed
-      or derivative code.</li>
-      
-      <li>Notice of any changes or modifications to the files, including
-      the date changes were made. (We recommend you provide URIs to the
-      location from which the code is derived.)</li>
-    </ol>
+	<li>Any pre-existing intellectual property disclaimers, notices, or
+	terms and conditions. If none exist, the <a
+		href="http://www.w3.org/Consortium/Legal/2002/copyright-software-short-notice-20021231.html">W3C
+	Software Short Notice</a> should be included (hypertext is preferred,
+	text is permitted) within the body of any redistributed or derivative
+	code.</li>
 
-    <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
-    COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY
-    OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE
-    SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,
-    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+	<li>Notice of any changes or modifications to the files, including the
+	date changes were made. (We recommend you provide URIs to the location
+	from which the code is derived.)</li>
+</ol>
 
-    <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
-    SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
-    SOFTWARE OR DOCUMENTATION.</p>
+<p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT
+HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR
+DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
+TRADEMARKS OR OTHER RIGHTS.</p>
 
-    <p>The name and trademarks of copyright holders may NOT be used in
-    advertising or publicity pertaining to the software without
-    specific, written prior permission. Title to copyright in this
-    software and any associated documentation will at all times remain
-    with copyright holders.</p>
-  </body>
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE
+OR DOCUMENTATION.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without specific,
+written prior permission. Title to copyright in this software and any
+associated documentation will at all times remain with copyright
+holders.</p>
+</body>
 </html>
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMConfiguration.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMConfiguration.java
index ce64f45..7cce160 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMConfiguration.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMConfiguration.java
@@ -1,12 +1,413 @@
+/*
+ * Copyright (c) 2004 World Wide Web Consortium,
+ *
+ * (Massachusetts Institute of Technology, European Research Consortium for
+ * Informatics and Mathematics, Keio University). All Rights Reserved. This
+ * work is distributed under the W3C(r) Software License [1] 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.
+ *
+ * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+ */
+
 package org.w3c.dom;
 
+/**
+ *  The <code>DOMConfiguration</code> interface represents the configuration 
+ * of a document and maintains a table of recognized parameters. Using the 
+ * configuration, it is possible to change 
+ * <code>Document.normalizeDocument()</code> behavior, such as replacing the 
+ * <code>CDATASection</code> nodes with <code>Text</code> nodes or 
+ * specifying the type of the schema that must be used when the validation 
+ * of the <code>Document</code> is requested. <code>DOMConfiguration</code> 
+ * objects are also used in [<a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407'>DOM Level 3 Load and Save</a>]
+ *  in the <code>DOMParser</code> and <code>DOMSerializer</code> interfaces. 
+ * <p> The parameter names used by the <code>DOMConfiguration</code> object 
+ * are defined throughout the DOM Level 3 specifications. Names are 
+ * case-insensitive. To avoid possible conflicts, as a convention, names 
+ * referring to parameters defined outside the DOM specification should be 
+ * made unique. Because parameters are exposed as properties in the , names 
+ * are recommended to follow the section 5.16 Identifiers of [Unicode] with the addition of the character '-' (HYPHEN-MINUS) but it is not 
+ * enforced by the DOM implementation. DOM Level 3 Core Implementations are 
+ * required to recognize all parameters defined in this specification. Some 
+ * parameter values may also be required to be supported by the 
+ * implementation. Refer to the definition of the parameter to know if a 
+ * value must be supported or not. 
+ * <p ><b>Note:</b>  Parameters are similar to features and properties used in 
+ * SAX2 [<a href='http://www.saxproject.org/'>SAX</a>]. 
+ * <p> The following list of parameters defined in the DOM: 
+ * <dl>
+ * <dt>
+ * <code>"canonical-form"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>] Canonicalize the document according to the rules specified in [<a href='http://www.w3.org/TR/2001/REC-xml-c14n-20010315'>Canonical XML</a>], 
+ * such as removing the <code>DocumentType</code> node (if any) from the 
+ * tree, or removing superfluous namespace declarations from each element. 
+ * Note that this is limited to what can be represented in the DOM; in 
+ * particular, there is no way to specify the order of the attributes in the 
+ * DOM. In addition,  Setting this parameter to <code>true</code> will also 
+ * set the state of the parameters listed below. Later changes to the state 
+ * of one of those parameters will revert "canonical-form" back to 
+ * <code>false</code>. Parameters set to <code>false</code>: "entities", "
+ * normalize-characters", "cdata-sections". Parameters set to 
+ * <code>true</code>: "namespaces", "namespace-declarations", "well-formed", 
+ * "element-content-whitespace". Other parameters are not changed unless 
+ * explicitly specified in the description of the parameters.</dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Do not canonicalize the document.</dd>
+ * </dl></dd>
+ * <dt><code>"cdata-sections"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Keep <code>CDATASection</code> nodes in the document.</dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>]Transform <code>CDATASection</code> nodes in the document into 
+ * <code>Text</code> nodes. The new <code>Text</code> node is then combined 
+ * with any adjacent <code>Text</code> node.</dd>
+ * </dl></dd>
+ * <dt>
+ * <code>"check-character-normalization"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>] Check if the characters in the document are <a href='http://www.w3.org/TR/2004/REC-xml11-20040204/#dt-fullnorm'>fully 
+ * normalized</a>, as defined in appendix B of [<a href='http://www.w3.org/TR/2004/REC-xml11-20040204/'>XML 1.1</a>]. When a 
+ * sequence of characters is encountered that fails normalization checking, 
+ * an error with the <code>DOMError.type</code> equals to 
+ * "check-character-normalization-failure" is issued. </dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Do not check if characters are normalized.</dd>
+ * </dl></dd>
+ * <dt><code>"comments"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Keep <code>Comment</code> nodes in the document.</dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>]Discard <code>Comment</code> nodes in the document.</dd>
+ * </dl></dd>
+ * <dt>
+ * <code>"datatype-normalization"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>] Expose schema normalized values in the tree, such as <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#key-nv'>XML 
+ * Schema normalized values</a> in the case of XML Schema. Since this parameter requires to have schema 
+ * information, the "validate" parameter will also be set to 
+ * <code>true</code>. Having this parameter activated when "validate" is 
+ * <code>false</code> has no effect and no schema-normalization will happen. 
+ * <p ><b>Note:</b>  Since the document contains the result of the XML 1.0 
+ * processing, this parameter does not apply to attribute value 
+ * normalization as defined in section 3.3.3 of [<a href='http://www.w3.org/TR/2004/REC-xml-20040204'>XML 1.0</a>] and is only 
+ * meant for schema languages other than Document Type Definition (DTD). </dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) Do not perform schema normalization on the tree. </dd>
+ * </dl></dd>
+ * <dt>
+ * <code>"element-content-whitespace"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Keep all whitespaces in the document.</dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>optional</em>] Discard all <code>Text</code> nodes that contain whitespaces in element 
+ * content, as described in <a href='http://www.w3.org/TR/2004/REC-xml-infoset-20040204#infoitem.character'>
+ * [element content whitespace]</a>. The implementation is expected to use the attribute 
+ * <code>Text.isElementContentWhitespace</code> to determine if a 
+ * <code>Text</code> node should be discarded or not.</dd>
+ * </dl></dd>
+ * <dt><code>"entities"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Keep <code>EntityReference</code> nodes in the document.</dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>required</em>] Remove all <code>EntityReference</code> nodes from the document, 
+ * putting the entity expansions directly in their place. <code>Text</code> 
+ * nodes are normalized, as defined in <code>Node.normalize</code>. Only <a href='http://www.w3.org/TR/2004/REC-xml-infoset-20040204/#infoitem.rse'>
+ * unexpanded entity references</a> are kept in the document. </dd>
+ * </dl>
+ * <p ><b>Note:</b>  This parameter does not affect <code>Entity</code> nodes. </dd>
+ * <dt>
+ * <code>"error-handler"</code></dt>
+ * <dd>[<em>required</em>] Contains a <code>DOMErrorHandler</code> object. If an error is 
+ * encountered in the document, the implementation will call back the 
+ * <code>DOMErrorHandler</code> registered using this parameter. The 
+ * implementation may provide a default <code>DOMErrorHandler</code> object. 
+ *  When called, <code>DOMError.relatedData</code> will contain the closest 
+ * node to where the error occurred. If the implementation is unable to 
+ * determine the node where the error occurs, 
+ * <code>DOMError.relatedData</code> will contain the <code>Document</code> 
+ * node. Mutations to the document from within an error handler will result 
+ * in implementation dependent behavior. </dd>
+ * <dt><code>"infoset"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>]Keep in the document the information defined in the XML Information Set [<a href='http://www.w3.org/TR/2004/REC-xml-infoset-20040204/'>XML Information Set</a>]
+ * .This forces the following parameters to <code>false</code>: "
+ * validate-if-schema", "entities", "datatype-normalization", "cdata-sections
+ * ".This forces the following parameters to <code>true</code>: "
+ * namespace-declarations", "well-formed", "element-content-whitespace", "
+ * comments", "namespaces".Other parameters are not changed unless 
+ * explicitly specified in the description of the parameters. Note that 
+ * querying this parameter with <code>getParameter</code> returns 
+ * <code>true</code> only if the individual parameters specified above are 
+ * appropriately set.</dd>
+ * <dt><code>false</code></dt>
+ * <dd>Setting <code>infoset</code> to 
+ * <code>false</code> has no effect.</dd>
+ * </dl></dd>
+ * <dt><code>"namespaces"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) Perform the namespace processing as defined in . </dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>optional</em>] Do not perform the namespace processing. </dd>
+ * </dl></dd>
+ * <dt>
+ * <code>"namespace-declarations"</code></dt>
+ * <dd> This parameter has no effect if the 
+ * parameter "namespaces" is set to <code>false</code>. 
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) Include namespace declaration attributes, specified or defaulted from 
+ * the schema, in the document. See also the sections "Declaring Namespaces" 
+ * in [<a href='http://www.w3.org/TR/1999/REC-xml-names-19990114/'>XML Namespaces</a>]
+ *  and [<a href='http://www.w3.org/TR/2004/REC-xml-names11-20040204/'>XML Namespaces 1.1</a>]
+ * .</dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>]Discard all namespace declaration attributes. The namespace prefixes (
+ * <code>Node.prefix</code>) are retained even if this parameter is set to 
+ * <code>false</code>.</dd>
+ * </dl></dd>
+ * <dt><code>"normalize-characters"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>] <a href='http://www.w3.org/TR/2004/REC-xml11-20040204/#dt-fullnorm'>Fully 
+ * normalized</a> the characters in the document as defined in appendix B of [<a href='http://www.w3.org/TR/2004/REC-xml11-20040204/'>XML 1.1</a>]. </dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Do not perform character normalization.</dd>
+ * </dl></dd>
+ * <dt><code>"schema-location"</code></dt>
+ * <dd>[<em>optional</em>] Represent a <code>DOMString</code> object containing a list of URIs, 
+ * separated by whitespaces (characters matching the <a href='http://www.w3.org/TR/2004/REC-xml-20040204#NT-S'>nonterminal 
+ * production S</a> defined in section 2.3 [<a href='http://www.w3.org/TR/2004/REC-xml-20040204'>XML 1.0</a>]), that 
+ * represents the schemas against which validation should occur, i.e. the 
+ * current schema. The types of schemas referenced in this list must match 
+ * the type specified with <code>schema-type</code>, otherwise the behavior 
+ * of an implementation is undefined.  The schemas specified using this 
+ * property take precedence to the schema information specified in the 
+ * document itself. For namespace aware schema, if a schema specified using 
+ * this property and a schema specified in the document instance (i.e. using 
+ * the <code>schemaLocation</code> attribute) in a schema document (i.e. 
+ * using schema <code>import</code> mechanisms) share the same 
+ * <code>targetNamespace</code>, the schema specified by the user using this 
+ * property will be used. If two schemas specified using this property share 
+ * the same <code>targetNamespace</code> or have no namespace, the behavior 
+ * is implementation dependent.  If no location has been provided, this 
+ * parameter is <code>null</code>. 
+ * <p ><b>Note:</b>  The <code>"schema-location"</code> parameter is ignored 
+ * unless the "schema-type" parameter value is set. It is strongly 
+ * recommended that <code>Document.documentURI</code> will be set so that an 
+ * implementation can successfully resolve any external entities referenced. </dd>
+ * <dt>
+ * <code>"schema-type"</code></dt>
+ * <dd>[<em>optional</em>] Represent a <code>DOMString</code> object containing an absolute URI 
+ * and representing the type of the schema language used to validate a 
+ * document against. Note that no lexical checking is done on the absolute 
+ * URI.  If this parameter is not set, a default value may be provided by 
+ * the implementation, based on the schema languages supported and on the 
+ * schema language used at load time. If no value is provided, this 
+ * parameter is <code>null</code>. 
+ * <p ><b>Note:</b>  For XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+ * , applications must use the value 
+ * <code>"http://www.w3.org/2001/XMLSchema"</code>. For XML DTD [<a href='http://www.w3.org/TR/2004/REC-xml-20040204'>XML 1.0</a>], 
+ * applications must use the value 
+ * <code>"http://www.w3.org/TR/REC-xml"</code>. Other schema languages are 
+ * outside the scope of the W3C and therefore should recommend an absolute 
+ * URI in order to use this method. </dd>
+ * <dt><code>"split-cdata-sections"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt>
+ * <code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>)Split CDATA sections containing the CDATA section termination marker 
+ * ']]&gt;'. When a CDATA section is split a warning is issued with a 
+ * <code>DOMError.type</code> equals to 
+ * <code>"cdata-sections-splitted"</code> and 
+ * <code>DOMError.relatedData</code> equals to the first 
+ * <code>CDATASection</code> node in document order resulting from the split.</dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>required</em>]Signal an error if a <code>CDATASection</code> contains an 
+ * unrepresentable character.</dd>
+ * </dl></dd>
+ * <dt><code>"validate"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>] Require the validation against a schema (i.e. XML schema, DTD, any 
+ * other type or representation of schema) of the document as it is being 
+ * normalized as defined by [<a href='http://www.w3.org/TR/2004/REC-xml-20040204'>XML 1.0</a>]. If 
+ * validation errors are found, or no schema was found, the error handler is 
+ * notified. Schema-normalized values will not be exposed according to the 
+ * schema in used unless the parameter "datatype-normalization" is 
+ * <code>true</code>.  This parameter will reevaluate: 
+ * <ul>
+ * <li> Attribute nodes with 
+ * <code>Attr.specified</code> equals to <code>false</code>, as specified in 
+ * the description of the <code>Attr</code> interface; 
+ * </li>
+ * <li> The value of the 
+ * attribute <code>Text.isElementContentWhitespace</code> for all 
+ * <code>Text</code> nodes; 
+ * </li>
+ * <li> The value of the attribute 
+ * <code>Attr.isId</code> for all <code>Attr</code> nodes; 
+ * </li>
+ * <li> The attributes 
+ * <code>Element.schemaTypeInfo</code> and <code>Attr.schemaTypeInfo</code>. 
+ * </li>
+ * </ul>
+ * <p ><b>Note:</b>  "validate-if-schema" and "validate" are mutually 
+ * exclusive, setting one of them to <code>true</code> will set the other 
+ * one to <code>false</code>. Applications should also consider setting the 
+ * parameter "well-formed" to <code>true</code>, which is the default for 
+ * that option, when validating the document. </dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) Do not accomplish schema processing, including the internal subset 
+ * processing. Default attribute values information are kept. Note that 
+ * validation might still happen if "validate-if-schema" is <code>true</code>
+ * . </dd>
+ * </dl></dd>
+ * <dt><code>"validate-if-schema"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>optional</em>]Enable validation only if a declaration for the document element can be 
+ * found in a schema (independently of where it is found, i.e. XML schema, 
+ * DTD, or any other type or representation of schema). If validation is 
+ * enabled, this parameter has the same behavior as the parameter "validate" 
+ * set to <code>true</code>. 
+ * <p ><b>Note:</b>  "validate-if-schema" and "validate" are mutually 
+ * exclusive, setting one of them to <code>true</code> will set the other 
+ * one to <code>false</code>. </dd>
+ * <dt><code>false</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) No schema processing should be performed if the document has a schema, 
+ * including internal subset processing. Default attribute values 
+ * information are kept. Note that validation must still happen if "validate
+ * " is <code>true</code>. </dd>
+ * </dl></dd>
+ * <dt><code>"well-formed"</code></dt>
+ * <dd>
+ * <dl>
+ * <dt><code>true</code></dt>
+ * <dd>[<em>required</em>] (<em>default</em>) Check if all nodes are XML well formed according to the XML version in 
+ * use in <code>Document.xmlVersion</code>: 
+ * <ul>
+ * <li> check if the attribute 
+ * <code>Node.nodeName</code> contains invalid characters according to its 
+ * node type and generate a <code>DOMError</code> of type 
+ * <code>"wf-invalid-character-in-node-name"</code>, with a 
+ * <code>DOMError.SEVERITY_ERROR</code> severity, if necessary; 
+ * </li>
+ * <li> check if 
+ * the text content inside <code>Attr</code>, <code>Element</code>, 
+ * <code>Comment</code>, <code>Text</code>, <code>CDATASection</code> nodes 
+ * for invalid characters and generate a <code>DOMError</code> of type 
+ * <code>"wf-invalid-character"</code>, with a 
+ * <code>DOMError.SEVERITY_ERROR</code> severity, if necessary; 
+ * </li>
+ * <li> check if 
+ * the data inside <code>ProcessingInstruction</code> nodes for invalid 
+ * characters and generate a <code>DOMError</code> of type 
+ * <code>"wf-invalid-character"</code>, with a 
+ * <code>DOMError.SEVERITY_ERROR</code> severity, if necessary; 
+ * </li>
+ * </ul></dd>
+ * <dt>
+ * <code>false</code></dt>
+ * <dd>[<em>optional</em>] Do not check for XML well-formedness. </dd>
+ * </dl></dd>
+ * </dl>
+ * <p> The resolution of the system identifiers associated with entities is 
+ * done using <code>Document.documentURI</code>. However, when the feature 
+ * "LS" defined in [<a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407'>DOM Level 3 Load and Save</a>]
+ *  is supported by the DOM implementation, the parameter 
+ * "resource-resolver" can also be used on <code>DOMConfiguration</code> 
+ * objects attached to <code>Document</code> nodes. If this parameter is 
+ * set, <code>Document.normalizeDocument()</code> will invoke the resource 
+ * resolver instead of using <code>Document.documentURI</code>. 
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
+ * @since DOM Level 3
+ */
 public interface DOMConfiguration {
-	public void setParameter(String name, Object value) throws DOMException;
+    /**
+     * Set the value of a parameter.
+     * @param name The name of the parameter to set.
+     * @param value  The new value or <code>null</code> if the user wishes to 
+     *   unset the parameter. While the type of the value parameter is 
+     *   defined as <code>DOMUserData</code>, the object type must match the 
+     *   type defined by the definition of the parameter. For example, if 
+     *   the parameter is "error-handler", the value must be of type 
+     *   <code>DOMErrorHandler</code>. 
+     * @exception DOMException
+     *    NOT_FOUND_ERR: Raised when the parameter name is not recognized. 
+     *   <br> NOT_SUPPORTED_ERR: Raised when the parameter name is recognized 
+     *   but the requested value cannot be set. 
+     *   <br> TYPE_MISMATCH_ERR: Raised if the value type for this parameter 
+     *   name is incompatible with the expected value type. 
+     */
+    public void setParameter(String name, 
+                             Object value)
+                             throws DOMException;
 
-	public Object getParameter(String name) throws DOMException;
+    /**
+     *  Return the value of a parameter if known. 
+     * @param name  The name of the parameter. 
+     * @return  The current object associated with the specified parameter or 
+     *   <code>null</code> if no object has been associated or if the 
+     *   parameter is not supported. 
+     * @exception DOMException
+     *    NOT_FOUND_ERR: Raised when the parameter name is not recognized. 
+     */
+    public Object getParameter(String name)
+                               throws DOMException;
 
-	public boolean canSetParameter(String name, Object value);
+    /**
+     * Check if setting a parameter to a specific value is supported.
+     * @param name The name of the parameter to check.
+     * @param value  An object. if <code>null</code>, the returned value is 
+     *   <code>true</code>. 
+     * @return  <code>true</code> if the parameter could be successfully set 
+     *   to the specified value, or <code>false</code> if the parameter is 
+     *   not recognized or the requested value is not supported. This does 
+     *   not change the current value of the parameter itself. 
+     */
+    public boolean canSetParameter(String name, 
+                                   Object value);
 
-	public DOMStringList getParameterNames();
+    /**
+     *  The list of the parameters supported by this 
+     * <code>DOMConfiguration</code> object and for which at least one value 
+     * can be set by the application. Note that this list can also contain 
+     * parameter names defined outside this specification. 
+     */
+    public DOMStringList getParameterNames();
 
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMStringList.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMStringList.java
index d222990..e6c348a 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMStringList.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/DOMStringList.java
@@ -1,10 +1,50 @@
+/*
+ * Copyright (c) 2004 World Wide Web Consortium,
+ *
+ * (Massachusetts Institute of Technology, European Research Consortium for
+ * Informatics and Mathematics, Keio University). All Rights Reserved. This
+ * work is distributed under the W3C(r) Software License [1] 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.
+ *
+ * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+ */
+
 package org.w3c.dom;
 
+/**
+ *  The <code>DOMStringList</code> interface provides the abstraction of an 
+ * ordered collection of <code>DOMString</code> values, without defining or 
+ * constraining how this collection is implemented. The items in the 
+ * <code>DOMStringList</code> are accessible via an integral index, starting 
+ * from 0. 
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
+ * @since DOM Level 3
+ */
 public interface DOMStringList {
+    /**
+     *  Returns the <code>index</code>th item in the collection. If 
+     * <code>index</code> is greater than or equal to the number of 
+     * <code>DOMString</code>s in the list, this returns <code>null</code>. 
+     * @param index Index into the collection.
+     * @return  The <code>DOMString</code> at the <code>index</code>th 
+     *   position in the <code>DOMStringList</code>, or <code>null</code> if 
+     *   that is not a valid index. 
+     */
     public String item(int index);
 
+    /**
+     * The number of <code>DOMString</code>s in the list. The range of valid 
+     * child node indices is 0 to <code>length-1</code> inclusive.
+     */
     public int getLength();
 
+    /**
+     *  Test if a string is part of this <code>DOMStringList</code>. 
+     * @param str  The string to look for. 
+     * @return  <code>true</code> if the string has been found, 
+     *   <code>false</code> otherwise. 
+     */
     public boolean contains(String str);
 
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/TypeInfo.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/TypeInfo.java
index 62e023e..054f990 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/TypeInfo.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/TypeInfo.java
@@ -1,18 +1,185 @@
+/*
+ * Copyright (c) 2004 World Wide Web Consortium,
+ *
+ * (Massachusetts Institute of Technology, European Research Consortium for
+ * Informatics and Mathematics, Keio University). All Rights Reserved. This
+ * work is distributed under the W3C(r) Software License [1] 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.
+ *
+ * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+ */
+
 package org.w3c.dom;
 
+/**
+ *  The <code>TypeInfo</code> interface represents a type referenced from 
+ * <code>Element</code> or <code>Attr</code> nodes, specified in the schemas 
+ * associated with the document. The type is a pair of a namespace URI and 
+ * name properties, and depends on the document's schema. 
+ * <p> If the document's schema is an XML DTD [<a href='http://www.w3.org/TR/2004/REC-xml-20040204'>XML 1.0</a>], the values 
+ * are computed as follows: 
+ * <ul>
+ * <li> If this type is referenced from an 
+ * <code>Attr</code> node, <code>typeNamespace</code> is 
+ * <code>"http://www.w3.org/TR/REC-xml"</code> and <code>typeName</code> 
+ * represents the <b>[attribute type]</b> property in the [<a href='http://www.w3.org/TR/2004/REC-xml-infoset-20040204/'>XML Information Set</a>]
+ * . If there is no declaration for the attribute, <code>typeNamespace</code>
+ *  and <code>typeName</code> are <code>null</code>. 
+ * </li>
+ * <li> If this type is 
+ * referenced from an <code>Element</code> node, <code>typeNamespace</code> 
+ * and <code>typeName</code> are <code>null</code>. 
+ * </li>
+ * </ul>
+ * <p> If the document's schema is an XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+ * , the values are computed as follows using the post-schema-validation 
+ * infoset contributions (also called PSVI contributions): 
+ * <ul>
+ * <li> If the <b>[validity]</b> property exists AND is <em>"invalid"</em> or <em>"notKnown"</em>: the {target namespace} and {name} properties of the declared type if 
+ * available, otherwise <code>null</code>. 
+ * <p ><b>Note:</b>  At the time of writing, the XML Schema specification does 
+ * not require exposing the declared type. Thus, DOM implementations might 
+ * choose not to provide type information if validity is not valid. 
+ * </li>
+ * <li> If the <b>[validity]</b> property exists and is <em>"valid"</em>: 
+ * <ol>
+ * <li> If <b>[member type definition]</b> exists: 
+ * <ol>
+ * <li>If {name} is not absent, then expose {name} and {target 
+ * namespace} properties of the <b>[member type definition]</b> property;
+ * </li>
+ * <li>Otherwise, expose the namespace and local name of the 
+ * corresponding anonymous type name.
+ * </li>
+ * </ol>
+ * </li>
+ * <li> If the <b>[type definition]</b> property exists: 
+ * <ol>
+ * <li>If {name} is not absent, then expose {name} and {target 
+ * namespace} properties of the <b>[type definition]</b> property;
+ * </li>
+ * <li>Otherwise, expose the namespace and local name of the 
+ * corresponding anonymous type name.
+ * </li>
+ * </ol> 
+ * </li>
+ * <li> If the <b>[member type definition anonymous]</b> exists: 
+ * <ol>
+ * <li>If it is false, then expose <b>[member type definition name]</b> and <b>[member type definition namespace]</b> properties;
+ * </li>
+ * <li>Otherwise, expose the namespace and local name of the 
+ * corresponding anonymous type name.
+ * </li>
+ * </ol> 
+ * </li>
+ * <li> If the <b>[type definition anonymous]</b> exists: 
+ * <ol>
+ * <li>If it is false, then expose <b>[type definition name]</b> and <b>[type definition namespace]</b> properties;
+ * </li>
+ * <li>Otherwise, expose the namespace and local name of the 
+ * corresponding anonymous type name.
+ * </li>
+ * </ol> 
+ * </li>
+ * </ol>
+ * </li>
+ * </ul>
+ * <p ><b>Note:</b>  Other schema languages are outside the scope of the W3C 
+ * and therefore should define how to represent their type systems using 
+ * <code>TypeInfo</code>. 
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
+ * @since DOM Level 3
+ */
 public interface TypeInfo {
+    /**
+     *  The name of a type declared for the associated element or attribute, 
+     * or <code>null</code> if unknown. 
+     */
     public String getTypeName();
 
+    /**
+     *  The namespace of the type declared for the associated element or 
+     * attribute or <code>null</code> if the element does not have 
+     * declaration or if no namespace information is available. 
+     */
     public String getTypeNamespace();
 
     // DerivationMethods
+    /**
+     *  If the document's schema is an XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+     * , this constant represents the derivation by <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#key-typeRestriction'>
+     * restriction</a> if complex types are involved, or a <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#element-restriction'>
+     * restriction</a> if simple types are involved. 
+     * <br>  The reference type definition is derived by restriction from the 
+     * other type definition if the other type definition is the same as the 
+     * reference type definition, or if the other type definition can be 
+     * reached recursively following the {base type definition} property 
+     * from the reference type definition, and all the <em>derivation methods</em> involved are restriction. 
+     */
     public static final int DERIVATION_RESTRICTION    = 0x00000001;
+    /**
+     *  If the document's schema is an XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+     * , this constant represents the derivation by <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#key-typeExtension'>
+     * extension</a>. 
+     * <br>  The reference type definition is derived by extension from the 
+     * other type definition if the other type definition can be reached 
+     * recursively following the {base type definition} property from the 
+     * reference type definition, and at least one of the <em>derivation methods</em> involved is an extension. 
+     */
     public static final int DERIVATION_EXTENSION      = 0x00000002;
+    /**
+     *  If the document's schema is an XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+     * , this constant represents the <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#element-union'>
+     * union</a> if simple types are involved. 
+     * <br> The reference type definition is derived by union from the other 
+     * type definition if there exists two type definitions T1 and T2 such 
+     * as the reference type definition is derived from T1 by 
+     * <code>DERIVATION_RESTRICTION</code> or 
+     * <code>DERIVATION_EXTENSION</code>, T2 is derived from the other type 
+     * definition by <code>DERIVATION_RESTRICTION</code>, T1 has {variety} <em>union</em>, and one of the {member type definitions} is T2. Note that T1 could be 
+     * the same as the reference type definition, and T2 could be the same 
+     * as the other type definition. 
+     */
     public static final int DERIVATION_UNION          = 0x00000004;
+    /**
+     *  If the document's schema is an XML Schema [<a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/'>XML Schema Part 1</a>]
+     * , this constant represents the <a href='http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#element-list'>list</a>. 
+     * <br> The reference type definition is derived by list from the other 
+     * type definition if there exists two type definitions T1 and T2 such 
+     * as the reference type definition is derived from T1 by 
+     * <code>DERIVATION_RESTRICTION</code> or 
+     * <code>DERIVATION_EXTENSION</code>, T2 is derived from the other type 
+     * definition by <code>DERIVATION_RESTRICTION</code>, T1 has {variety} <em>list</em>, and T2 is the {item type definition}. Note that T1 could be the same as 
+     * the reference type definition, and T2 could be the same as the other 
+     * type definition. 
+     */
     public static final int DERIVATION_LIST           = 0x00000008;
 
+    /**
+     *  This method returns if there is a derivation between the reference 
+     * type definition, i.e. the <code>TypeInfo</code> on which the method 
+     * is being called, and the other type definition, i.e. the one passed 
+     * as parameters. 
+     * @param typeNamespaceArg  the namespace of the other type definition. 
+     * @param typeNameArg  the name of the other type definition. 
+     * @param derivationMethod  the type of derivation and conditions applied 
+     *   between two types, as described in the list of constants provided 
+     *   in this interface. 
+     * @return  If the document's schema is a DTD or no schema is associated 
+     *   with the document, this method will always return <code>false</code>
+     *   .  If the document's schema is an XML Schema, the method will 
+     *   <code>true</code> if the reference type definition is derived from 
+     *   the other type definition according to the derivation parameter. If 
+     *   the value of the parameter is <code>0</code> (no bit is set to 
+     *   <code>1</code> for the <code>derivationMethod</code> parameter), 
+     *   the method will return <code>true</code> if the other type 
+     *   definition can be reached by recursing any combination of {base 
+     *   type definition}, {item type definition}, or {member type 
+     *   definitions} from the reference type definition. 
+     */
     public boolean isDerivedFrom(String typeNamespaceArg, 
                                  String typeNameArg, 
                                  int derivationMethod);
 
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/UserDataHandler.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/UserDataHandler.java
index a1b0f1b..a16ea73 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/UserDataHandler.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/UserDataHandler.java
@@ -1,17 +1,72 @@
+/*
+ * Copyright (c) 2004 World Wide Web Consortium,
+ *
+ * (Massachusetts Institute of Technology, European Research Consortium for
+ * Informatics and Mathematics, Keio University). All Rights Reserved. This
+ * work is distributed under the W3C(r) Software License [1] 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.
+ *
+ * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+ */
+
 package org.w3c.dom;
 
+/**
+ * When associating an object to a key on a node using 
+ * <code>Node.setUserData()</code> the application can provide a handler 
+ * that gets called when the node the object is associated to is being 
+ * cloned, imported, or renamed. This can be used by the application to 
+ * implement various behaviors regarding the data it associates to the DOM 
+ * nodes. This interface defines that handler. 
+ * <p>See also the <a href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407'>Document Object Model (DOM) Level 3 Core Specification</a>.
+ * @since DOM Level 3
+ */
 public interface UserDataHandler {
     // OperationType
+    /**
+     * The node is cloned, using <code>Node.cloneNode()</code>.
+     */
     public static final short NODE_CLONED               = 1;
+    /**
+     * The node is imported, using <code>Document.importNode()</code>.
+     */
     public static final short NODE_IMPORTED             = 2;
+    /**
+     * The node is deleted.
+     * <p ><b>Note:</b> This may not be supported or may not be reliable in 
+     * certain environments, such as Java, where the implementation has no 
+     * real control over when objects are actually deleted.
+     */
     public static final short NODE_DELETED              = 3;
+    /**
+     * The node is renamed, using <code>Document.renameNode()</code>.
+     */
     public static final short NODE_RENAMED              = 4;
+    /**
+     * The node is adopted, using <code>Document.adoptNode()</code>.
+     */
     public static final short NODE_ADOPTED              = 5;
 
+    /**
+     * This method is called whenever the node for which this handler is 
+     * registered is imported or cloned.
+     * <br> DOM applications must not raise exceptions in a 
+     * <code>UserDataHandler</code>. The effect of throwing exceptions from 
+     * the handler is DOM implementation dependent. 
+     * @param operation Specifies the type of operation that is being 
+     *   performed on the node.
+     * @param key Specifies the key for which this handler is being called. 
+     * @param data Specifies the data for which this handler is being called. 
+     * @param src Specifies the node being cloned, adopted, imported, or 
+     *   renamed. This is <code>null</code> when the node is being deleted.
+     * @param dst Specifies the node newly created if any, or 
+     *   <code>null</code>.
+     */
     public void handle(short operation, 
                        String key, 
                        Object data, 
                        Node src, 
                        Node dst);
 
-}
\ No newline at end of file
+}
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/DocumentRange.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/DocumentRange.java
index 93e3310..b72a1c1 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/DocumentRange.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/DocumentRange.java
@@ -1,3 +1,14 @@
+/*
+ * 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;
 
@@ -5,9 +16,9 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface DocumentRange {
 	/**
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/Range.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/Range.java
index a22c897..170fc60 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/Range.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/Range.java
@@ -1,69 +1,202 @@
+/*
+ * 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.DOMException;
-import org.w3c.dom.DocumentFragment;
 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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface Range {
 	/**
-	 * 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 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;
-
-	// 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;
-
-	/**
-	 * Duplicates the contents of a Range
+	 * Node within which the Range begins
 	 * 
-	 * @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;
-
-	/**
-	 * 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;
+	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
@@ -78,6 +211,64 @@
 	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
@@ -112,19 +303,6 @@
 	public void deleteContents() 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;
-
-	/**
 	 * Moves the contents of a Range from the containing document or document
 	 * fragment to a new DocumentFragment.
 	 * 
@@ -142,59 +320,17 @@
 	public DocumentFragment extractContents() throws DOMException;
 
 	/**
-	 * TRUE if the Range is collapsed
+	 * 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 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;
-
-	/**
-	 * 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;
-
-	/**
-	 * 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;
+	public DocumentFragment cloneContents() throws DOMException;
 
 	/**
 	 * Inserts a node into the Document or DocumentFragment at the start of
@@ -228,156 +364,6 @@
 	public void insertNode(Node newNode) throws DOMException, RangeException;
 
 	/**
-	 * 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;
-
-	/**
-	 * 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 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;
-
-	/**
-	 * 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 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 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 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;
-
-	/**
 	 * Reparents the contents of the Range to the given node and inserts the
 	 * node at the position of the start of the Range.
 	 * 
@@ -409,6 +395,17 @@
 	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.
 	 * 
@@ -419,4 +416,17 @@
 	 */
 	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/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/RangeException.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/RangeException.java
index 293e343..325acbd 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/RangeException.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/ranges/RangeException.java
@@ -1,3 +1,14 @@
+/*
+ * 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;
 
@@ -7,15 +18,17 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public class RangeException extends RuntimeException {
-	/**
-	 * Default <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 1L;
+	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.
@@ -28,11 +41,4 @@
 	 */
 	public static final short INVALID_NODE_TYPE_ERR = 2;
 
-	public short code;
-
-	public RangeException(short code, String message) {
-		super(message);
-		this.code = code;
-	}
-
 }
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/DocumentTraversal.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/DocumentTraversal.java
index 94b583e..b56d0fc 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/DocumentTraversal.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/DocumentTraversal.java
@@ -1,8 +1,19 @@
+/*
+ * 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.traversal;
 
-import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
 
 /**
  * <code>DocumentTraversal</code> contains methods that create iterators and
@@ -14,9 +25,9 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface DocumentTraversal {
 	/**
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeFilter.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeFilter.java
index 86d56e5..5badf1d 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeFilter.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeFilter.java
@@ -1,3 +1,14 @@
+/*
+ * 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.traversal;
 
@@ -23,9 +34,9 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface NodeFilter {
 	// Constants returned by acceptNode
@@ -84,7 +95,7 @@
 	public static final int SHOW_ENTITY_REFERENCE = 0x00000010;
 	/**
 	 * Show <code>Entity</code> nodes. This is meaningful only when creating
-	 * an iterator or tree-walker with an <code> Entity</code> node as its
+	 * an iterator or tree-walker with an<code> Entity</code> node as its
 	 * <code>root</code>; in this case, it means that the
 	 * <code>Entity</code> node will appear in the first position of the
 	 * traversal. Since entities are not part of the document tree, they do
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeIterator.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeIterator.java
index b7a5770..8616e70 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeIterator.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/NodeIterator.java
@@ -1,8 +1,19 @@
+/*
+ * 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.traversal;
 
-import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
 
 /**
  * <code>Iterators</code> are used to step through a set of nodes, e.g. the
@@ -17,9 +28,9 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface NodeIterator {
 	/**
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/TreeWalker.java b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/TreeWalker.java
index 92155b1..0ec2e62 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/TreeWalker.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/w3c/dom/traversal/TreeWalker.java
@@ -1,8 +1,19 @@
+/*
+ * 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.traversal;
 
-import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
+import org.w3c.dom.DOMException;
 
 /**
  * <code>TreeWalker</code> objects are used to navigate a document tree or
@@ -23,9 +34,9 @@
  * <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>.
+ * Object Model (DOM) Level 2 Traversal and Range Specification</a>.
  * 
- * @see DOM Level 2
+ * @since DOM Level 2
  */
 public interface TreeWalker {
 	/**
@@ -90,7 +101,7 @@
 	/**
 	 * Moves to and returns the closest visible ancestor node of the current
 	 * node. If the search for <code>parentNode</code> attempts to step
-	 * upward from the <code>TreeWalker</code>'s<code>root</code> node,
+	 * upward from the <code>TreeWalker</code>'s <code>root</code> node,
 	 * or if it fails to find a visible ancestor node, this method retains the
 	 * current position and returns <code>null</code>.
 	 * 
@@ -149,7 +160,7 @@
 	 * document order relative to the current node, and returns the new node.
 	 * If the current node has no previous node, or if the search for
 	 * <code>previousNode</code> attempts to step upward from the
-	 * <code>TreeWalker</code>'s<code>root</code> node, returns
+	 * <code>TreeWalker</code>'s <code>root</code> node, returns
 	 * <code>null</code>, and retains the current node.
 	 * 
 	 * @return The new node, or <code>null</code> if the current node has no
